• BZOJ[3517] 翻硬币


     这个题...就算解不了异或方程组也是要写一写式子的

       行列都是偶数也应该是异或偶数次能消掉的提示

       那么假设当前的目标状态是把所有的点都变成0;

       设X[i][j]为这个点有没有被操作;

       那么对于一个点列出出来的方程就是这个点所在行,列所有点的X值在异或他的初始状态为0,然后把这行    这列所有点的方程异或起来,就能神奇的发现,随后就只剩下X[i][j]没有异或掉(因为行数,列数都是偶        数),然后x[i][j]就等于其所在行,列的原状态异或起来,然后统计有多少X[i][j]的值为1,就是变为零的方     案,然后原来操作的点都不操作,不操作的点都操作就是边成1的,ans=min(cnt,n*n-cnt);

      Code

      

     1 #include <cmath>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <iostream>
     6 #include <algorithm>
     7 # define maxn 1010
     8 using namespace std;
     9 int n;
    10 int sum1[maxn],sum2[maxn],Num[maxn][maxn],X[maxn][maxn];
    11 char s[maxn];
    12 int main(){
    13     // freopen("a.in","r",stdin);
    14     scanf("%d",&n);
    15     for(int i=1;i<=n;i++){
    16         scanf("%s",&s);
    17         for(int j=0;j<n;j++)
    18             Num[i][j+1]=s[j]-'0';
    19     }
    20     for(int i=1;i<=n;i++)
    21         for(int j=1;j<=n;j++)
    22             sum1[i]^=Num[i][j];
    23     for(int j=1;j<=n;j++)
    24         for(int i=1;i<=n;i++)
    25             sum2[j]^=Num[i][j];
    26     int cnt=0;
    27     for(int i=1;i<=n;i++){
    28         for(int j=1;j<=n;j++){
    29             X[i][j]=sum1[i]^sum2[j]^Num[i][j];
    30             if(X[i][j]) cnt++;
    31             // cout<<X[i][j];
    32         } 
    33         // cout<<endl;
    34     }
    35     cnt=min(cnt,n*n-cnt);
    36     cout<<cnt<<endl;
    37 }
    View Code

     

  • 相关阅读:
    保证测试通过的ip正则,antdIP/IP段的校验方法,antd的textArea中可以输入多个以换行分隔的ip/IP段,并自动检测出错行的原因
    TP5接口出错只能返回500
    UDP服务只能本机访问问题
    有出现了找半天的小BUG
    PHP本地安装redis扩展
    MYSQL数据库和es数据库同步
    QQ互联应用申请失败
    axios跨域问题解决
    elastic和kibana安装心得
    自增运算符理解
  • 原文地址:https://www.cnblogs.com/FOXYY/p/7664958.html
Copyright © 2020-2023  润新知