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\n");
            printf("1");
            for(int i=1;i<=a;++i) printf("0");
            printf("\n1");
            for(int i=1;i<=a;++i) printf("0");
        }
        else printf("No");
    }
    else
    {
        if(!k)
        {
            printf("Yes\n");
            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]='\0';
            printf("%s\n%s",s+1,t+1); 
        }
        else if(!a)
        {
            if(!k)
            {
                printf("Yes\n");
                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]='\0';
                printf("%s\n%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]='\0';
            printf("Yes\n%s\n%s",s+1,t+1);
        }
        else printf("No");
    }
}
复制代码

 

posted @   TRTTG  阅读(43)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2020-10-03 洛谷P2124 奶牛美容
点击右上角即可分享
微信分享提示