Gym 102536 B C.U.P.S. —— 想法,模拟

This way

题意:

给你一个01串 长n,你有n次机会,每次flip其中恰好m个位置(也就是异或一个01串,恰好有m个1),如果原来的串变成全1了就结束,让你输出一个方案。

题解:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我。。懒得在敲一遍了,反正是队友写的代码,我就直接都复制粘贴了,为什么要写博客呢,,是因为看上去好像做了题目的样子,不写白不写
思路对了就行了,至于代码应该顺着写下去就好了

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i = (int)a;i<=(int)b;i++)
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=105;
const int inf=1e9+7;
int n,m,a[maxn],ans[maxn][maxn],cnt;

vector<int> ze,on,tmp,tze;
void out(){
    printf("%d\n",cnt);
    rep(i,1,cnt){
        rep(j,1,n) printf("%d",ans[i][j]);
        printf("\n");
    }
}
void prin(vector<int> x,int mo){
    int th[maxn]={0};
    for(auto t:x){
        th[t]=1;
    }
    if(mo!=-1) th[mo]=1;
    cnt++;
    for(int i=1;i<=n;i++){
        ans[cnt][i]=th[i];
    }
}
int main(){
    int T; scanf("%d",&T);
    while(T--){
        ze.clear(); on.clear();
        scanf("%d%d",&n,&m);
        cnt=0;
        rep(i,1,n) {
            scanf("%1d",&a[i]);
            if(a[i]) on.pb(i);
            else ze.pb(i);
        }
        if(m==1){
            printf("%d\n",ze.size());
            for(int i=0;i<ze.size();i++){
                int now=ze[i];
                rep(j,1,n){
                    if(j==now) printf("1");
                    else printf("0");
                }
                printf("\n");
            }
            continue;
        }
        if(m==n){
            if(ze.size()) {
                if(ze.size()==n){
                    printf("1\n");
                    rep(i,1,n) printf("1");
                    printf("\n");
                }
                else printf("CATACLYSM IMMINENT - TIME TO HOARD FACE MASKS\n");
            }
            else printf("0\n");
            continue;
        }
        if(ze.size()%2==0){
            for(int i=0;i<ze.size();i+=2){
                int fi=ze[i],se=ze[i+1];
                tmp.clear();
                for(int i=1;i<=n;i++) {
                    if(i!=fi&&i!=se) {
                        tmp.pb(i);
                        if(tmp.size()==m-1) break;
                    }
                }
                prin(tmp,fi); prin(tmp,se);
            }
            out();
            continue;
        }
        else{
            if(m%2==0) {
                printf("CATACLYSM IMMINENT - TIME TO HOARD FACE MASKS\n");
                continue;
            }
            int chod=1,chev=m-1,f=0;
            while(1){
                if(chod>m) break;
                if(ze.size()>=chod&&on.size()>=chev){
                    if((ze.size()-chod+chev)==n) continue;
                    f=1;
                    break;
                }
                chod++; chev--;
            }
            if(!f) {
                printf("CATACLYSM IMMINENT - TIME TO HOARD FACE MASKS\n");
                continue;
            }
            tze.clear();  tmp.clear();
            for(int i=0;i<ze.size();i++){
                if(i<chod) {
                    tmp.pb(ze[i]);
                }
                else tze.pb(ze[i]);
            }
            for(int i=0;i<on.size();i++){
                if(i<chev) {
                    tmp.pb(on[i]);
                    tze.pb(on[i]);
                }
            }
            prin(tmp,-1);

            for(int i=0;i<tze.size();i+=2){
                int fi=tze[i],se=tze[i+1];
                tmp.clear();
                for(int i=1;i<=n;i++) {
                    if(i!=fi&&i!=se) {
                        tmp.pb(i);
                        if(tmp.size()==m-1) break;
                    }
                }
                prin(tmp,fi); prin(tmp,se);
            }
            out();
        }

    }
    return 0;
}

发布了584 篇原创文章 · 获赞 33 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/tianyizhicheng/article/details/104807455