Codeforces Round #704 (Div. 2) D

D. Genius's Gambit

构造
要是a>=k的构造很好想出来
但是a+b-1>k&&k>a时 其实也可以构造出来
我们考虑让中间的一些1经过减法变成0 然后到高位时再与低位的1相减
例如:
11111100000
10111100001
这样我们最多就可以得到a+b-2个1了!
最后注意特判当b1时 只有k0才有解
当a0时 也只有k0时才有解

void solve(){
    int a,b,k;cin>>a>>b>>k;
    if(b==1){
        if(!k){
            YES
            for(int i=1;i<=b;i++)cout<<1;
            for(int i=1;i<=a;i++)cout<<0;
            cout<<endl;
            for(int i=1;i<=b;i++)cout<<1;
            for(int i=1;i<=a;i++)cout<<0;
            cout<<endl;
        }else{
            NO
        }
        return;
    }
    if(a==0&&k){
        NO return;
    }
    if(a+b-1>k){
        YES
        if(a>=k) {
            int cnt = a - k;
            for (int i = 1; i <= b; i++)cout << 1;
            for (int i = 1; i <= a; i++)cout << 0;
            cout << endl;
            for (int i = 1; i < b; i++)cout << 1;
            while (k--)cout << 0;
            cout << 1;
            for (int i = 1; i <= cnt; i++)cout << 0;
            cout << endl;
        }else{
            for (int i = 1; i <= b; i++)cout << 1;
            for (int i = 1; i <= a; i++)cout << 0;
            cout<<endl;
            int cnt=a+b-1-k,cnt1=b-cnt;
            while(cnt--)cout<<1;
            cout<<0;
            for(int i=1;i<cnt1;i++)cout<<1;
            for(int i=1;i<=a-1;i++)cout<<0;
            cout<<1;
            cout<<endl;
        }
    }else{
        NO
    }
}
posted @ 2022-11-09 16:29  ycllz  阅读(38)  评论(0)    收藏  举报