2023牛客暑假多校3


A

签到题。

$x$ 有 $1$ 那么答案就是 $|x-y|$ 。

$x$ 为 $0$ 时,若 $y$ 为 $0$ 则输出 $0$ ,反之输出 $-1$ 。


D

可以推出满足题目中条件时,方阵要么全是 $1$ 要么全是 $0$ 。

那么有解的情况就是每行/列都是互逆的两种形态。

取操作次数最少的情况即可。

#include<bits/stdc++.h>
#define N 2010
#define INF 1e8
using namespace std;

int n,ans=INF;
string a[N];
void work() {
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    bitset<2000> r[n],c[n];
    for(int i=0;i<n;i++) {
        for(int j=0;j<n;j++) r[i][j]=c[j][i]=(a[i][j]-'0');
    }
    vector<bitset<2000> > v;
    v.push_back(r[0]);
    bool flag=true;
    for(int i=1;i<n;i++) {
        if(r[i]==v[0]) continue;
        if(r[i]!=v[0]&&v.size()==1) v.push_back(r[i]);
        if(v.size()==2) {
            if(r[i]==v[1]) continue;
            else {
                flag=false;
                break;
            }
        }
    }
    if(flag) {
        if(v.size()==1) ans=min(ans,min((int)(n-r[0].count()),(int)r[0].count()));
        else if(v.size()==2) {
            if((v[0]^v[1]).count()==n) {
                int cnt1=0,cnt2=0;
                for(int i=0;i<n;i++) {
                    if(r[i]==v[0]) cnt1++;
                    else if(r[i]==v[1]) cnt2++;
                }
                ans=min(ans,(int)min(min(cnt1+n-v[1].count(),cnt1+v[1].count()),min(cnt2+n-v[0].count(),cnt2+v[0].count())));
            }
        }
    }
    v.clear();
    v.push_back(c[0]);
    flag=true;
    for(int i=1;i<n;i++) {
        if(c[i]==v[0]) continue;
        if(c[i]!=v[0]&&v.size()==1) v.push_back(c[i]);
        if(v.size()==2) {
            if(c[i]==v[1]) continue;
            else {
                flag=false;
                break;
            }
        }
    }
    if(flag) {
        if(v.size()==1) ans=min(ans,min((int)(n-c[0].count()),(int)c[0].count()));
        else if(v.size()==2) {
            if((v[0]^v[1]).count()==n) {
                int cnt1=0,cnt2=0;
                for(int i=0;i<n;i++) {
                    if(c[i]==v[0]) cnt1++;
                    else if(c[i]==v[1]) cnt2++;
                }
                ans=min(ans,(int)min(min(cnt1+n-v[1].count(),cnt1+v[1].count()),min(cnt2+n-v[0].count(),cnt2+v[0].count())));
            }
        }
    }
    if(ans==INF) cout<<"-1\n";
    else cout<<ans<<endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    work();
}

文章作者: HoshiuZ
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 HoshiuZ !
  目录