Problems
![](https://i-blog.csdnimg.cn/blog_migrate/7dac2b9a01e4324855c3de4757928f9c.png)
A.找规律或者公式。
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int main()
{
LL n;
cin>>n;
if(n%2)
cout<<-(n+1)/2<<endl;
else
cout<<n/2<<endl;
return 0;
}
B.贪心,首先将初始化答案矩阵全为1 对于给定矩阵的每个OR和为0 的位置 将答案矩阵所对应的行列都置为 0。
最后验证是否符合要求。
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#define INF 0x7fffffff
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int a[105][105];
int b[105][105];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
b[i][j]=1;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
cin>>a[i][j];
if(a[i][j]==0)
{
for(int k=0; k<n; k++) b[k][j]=0;
for(int k=0; k<m; k++) b[i][k]=0;
}
}
int ok=1;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(a[i][j]==1)
{
int f=0;
for(int k=0; k<n; k++) f|=b[k][j] ;
for(int k=0; k<m; k++) f|=b[i][k] ;
ok&=f;
}
}
if(ok)
{
puts("YES");
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
}
else puts("NO");
return 0;
}
C.贪心模拟。首先找出所需修改的最小区间,最小区间一定是两个,即中点左右各一个并且对称。然后将指针移动到距离最近的一个端点。扫描一遍该区间,即可得到结果。
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#define INF 0x7fffffff
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
char str[N];
int main()
{
int n,m;
cin>>n>>m;
cin>>str;
if(m>n/2)
{
reverse(str,str+n);
m=n-m+1;
}
m--;
int l=-1;
int r=-1;
for(int i=0; i<n/2 ; i++)
{
if(str[i]!=str[n-i-1] && i<=m && l==-1) l=i;
if(str[i]!=str[n-i-1] && i>=m) r=i;
}
if(r == -1) r=m;
if(l == -1) l=m;
int ans = 0;
for(int i=l; i<=r; i++)
{
int d=abs(str[i]-str[n-i-1]);
ans+=min(d,26-d);
}
ans+=r-l;
ans+=min(r-m,m-l);
cout<<ans;
return 0;
}
D.枚举每一个点作为权值最小的点,可依据乘法原理计算出所有符合要求的集合数量。但是注意避免重复计数。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2000 + 10;
const int MOD = 1e9 + 7;
vector <int> G[N];
int w[N];
int d,n;
int dfs(int u,int rt,int fa)
{
int ret = 1;
for(int i=0;i<G[u].size();i++)
{
int v = G[u][i];
if(v == fa)
continue ;
if(w[v] < w[rt] || w[v] > w[rt]+d || w[v] == w[rt] && v < rt)
continue;
ret = ((LL)ret * (dfs(v,rt,u)+1)) % MOD;
}
return ret;
}
int main()
{
cin >> d >> n;
for(int i=0;i<n;i++)
cin >> w[i];
for(int i=0;i<n-1;i++)
{
int x,y;
cin>>x>>y;
x--,y--;
G[x].push_back(y);
G[y].push_back(x);
}
int ans = 0;
for(int i=0;i<n;i++)
ans = (ans + dfs(i,i,i)) % MOD;
cout << ans <<endl;
return 0;
}
E.待补