• CF1492 D. Genius's Gambit


    Problem - 1492D - Codeforces

    题意:

    给出a b k,构造两个二进制数x和y(x>=y,不能有前导0),使x-y的二进制有k个1

    1XXX0

    0XXX1

    手算可以发现,若x有一段以1开头以0结尾,长为L的区间,对应的y这一段为以0开头以1结尾,中间的x和y都一样

    那么这一段区间相减的结果是L-1个1和1个0

    按照这个思路可以构造出相减的结果为先有1个0然后有k个1,后面都是0

    这样构造的要求是至少有1个0且至少有2个1(开头是1,还有1个上面说的区间里的1)且k<=a+b-2

    所以要对这些情况进行特判

    k=0也要特判

    #include<cstdio>
    
    char s[200002],t[200002];
    
    int main()
    {
        int a,b,k,p;
        scanf("%d%d%d",&a,&b,&k);
        p=a+b;
        if(b==1)
        {
            if(!k) 
            {
                printf("Yes
    ");
                printf("1");
                for(int i=1;i<=a;++i) printf("0");
                printf("
    1");
                for(int i=1;i<=a;++i) printf("0");
            }
            else printf("No");
        }
        else
        {
            if(!k)
            {
                printf("Yes
    ");
                for(int i=1;i<=b;++i) s[i]=t[i]='1';
                for(int i=1;i<=a;++i) s[b+i]=t[b+i]='0';
                s[a+b+1]=t[a+b+1]='';
                printf("%s
    %s",s+1,t+1); 
            }
            else if(!a)
            {
                if(!k)
                {
                    printf("Yes
    ");
                    for(int i=1;i<=b;++i) s[i]=t[i]='1';
                    for(int i=1;i<=a;++i) s[b+i]=t[b+i]='0';
                    s[a+b+1]=t[a+b+1]='';
                    printf("%s
    %s",s+1,t+1); 
                }
                else printf("No");
            }
            else if(k<=a+b-2)
            {
                s[1]=t[1]='1';
                s[2]='1';
                t[2]='0';
                b-=2;
                a-=1;
                for(int i=1;i<=k-1;++i) 
                {
                    if(b)
                    {
                        s[i+2]=t[i+2]='1';
                        --b;
                    }
                    else 
                    {
                        s[i+2]=t[i+2]='0';
                        --a;
                    }
                }
                s[k+2]='0';
                t[k+2]='1';
                for(int i=k+3;a||b;++i)
                {
                    if(a)
                    {
                        s[i]=t[i]='0';
                        --a;
                    }
                    else
                    {
                        s[i]=t[i]='1';
                        --b;
                    }
                }
                s[p+1]=t[p+1]='';
                printf("Yes
    %s
    %s",s+1,t+1);
            }
            else printf("No");
        }
    }
    作者:xxy
    本文版权归作者和博客园共有,转载请用链接,请勿原文转载,Thanks♪(・ω・)ノ。
  • 相关阅读:
    递归的初步应用
    最大公约数与最小公倍数(低效)
    进制转换
    凸多边形的面积问题
    单词替换
    DNA排序
    字符串排序
    倒三角形
    韩信点兵
    oracle
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/15363613.html
Copyright © 2020-2023  润新知