codeforces.com/problemset/…
12分钟才猜出结果,还是太菜了。
设 r 是其中所有数字的比特 XOR 为 11 的行数,而 c 是其中所有数字的比特 XOR 为 11 的列数。我们的目标是使 r 和 c 都为零。 当我们改变矩阵中的一个元素时, r 和 c 都会恰好改变一个。因此,不难看出答案是 max(r,c) 。
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int a[N][N],x[N],y[N],t,n,m;
char c[N][N];
int main(void)
{
cin>>t;
while(t--)
{
cin>>n>>m;
memset(x,0,sizeof x);
memset(y,0,sizeof y);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++) cin>>c[i][j],a[i][j]=c[i][j]-'0';
int ansx=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++) x[i]+=a[i][j];
for(int i=0;i<n;i++)
if(x[i]&1) ansx++;
int ansy=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++) y[i]+=a[j][i];
for(int i=0;i<m;i++)
if(y[i]&1) ansy++;
cout<<max(ansx,ansy)<<'\n';
}
return 0;
}
其实就是我们可以发现,行的为1的个数+列的为1的个数一定是偶数。 min(l,r)一定可以将公共的先消除,此时剩下的abs(l-r)单独的修改,每次+1 -1 因为是偶数。 假如r=2 l=0 搞一次此时r=1 l=1再搞一次 r=0 l=0;