A. Binary Matrix【800/思维 贪心】

126 阅读1分钟

image.png 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;