D. Genius's Gambit 题解(构造)

题目链接

题目大意

让你构造两个二进制数\(x,y(y \leq x)\)

\(x,y\)\(a\)\(0\),\(b\)\(1\)

要使得\(x-y\)\(k\)\(1\)

\(0\leq a; 1\leq b;0\leq k\leq a+b\leq 2e5\)

题目思路

其实很简单就是

11xxxx0xxx
10xxxx1xxx

x代表相同

\(k\leq a+b-2\)则可以构造

还要一些边界情况特殊考虑即可

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int a,b,k;
int ans1[maxn],ans2[maxn];
void pr(int x,int len){
    while(len--){
        printf("%d",x);
    }
}
int main(){
    scanf("%d%d%d",&a,&b,&k);
    if(a==0){
        if(k==0){
            printf("Yes\n");
            pr(1,b);
            printf("\n");
            pr(1,b);
            printf("\n");
        }else{
            printf("No\n");
        }
    }else if(b==1){
        if(k==0){
            printf("Yes\n");
            pr(1,1),pr(0,a);
            printf("\n");
            pr(1,1),pr(0,a);
            printf("\n");
        }else{
            printf("No\n");
        }
    }else if(k==0){
        printf("Yes\n");
        pr(1,b),pr(0,a);
        printf("\n");
        pr(1,b),pr(0,a);
        printf("\n");
    }else if(k<=a+b-2){
        printf("Yes\n");
        for(int i=1;i<=a+b;i++){
            if(i<=b){
                ans1[i]=ans2[i]=1;
            }else{
                ans1[i]=ans2[i]=0;
            }
        }
        swap(ans1[k+2],ans1[a+b]);
        swap(ans2[2],ans2[a+b]);
        swap(ans2[k+2],ans2[a+b]);
        for(int i=1;i<=a+b;i++){
            printf("%d",ans1[i]);
        }
        printf("\n");
        for(int i=1;i<=a+b;i++){
            printf("%d",ans2[i]);
        }
        printf("\n");
    }else{
        printf("No\n");
    }
    return 0;
}

不摆烂了,写题
原文地址:https://www.cnblogs.com/hunxuewangzi/p/14439883.html