【codeforce 708e】Recover the String

来源:互联网 发布:树莓派3 有线网络配置 编辑:程序博客网 时间:2024/06/10 01:24

每一次写codeforce的时候都感觉好像智商不够用,各种套路脑洞。结果下来看题解又莫名.....

首先  我们需要知道0和1各出现了多少次,就好够造了,因为每增加一个0或者1    00,11的对数就会增加之前出现的0,才数个,求出了0,1的总个数以后我们先特判不可能的情况,很显然00,11的个数和==1的个数*0的个数。好了,现在来构造,考虑这样一个事实如果01的个数比1多说明了什么?说明之前一定有出现多个0来组合出01,所以每次添加一个0对于01的贡献就是还没有出现的1的个数,10同理。然后每次0--,1--

#include<cstdio>#include<cstring>#include<iostream>using namespace std;int oo,ol,lo,ll,len,nl,no,c1,c0;string ans;int main(){scanf("%d%d%d%d",&oo,&ol,&lo,&ll);if(oo+lo+ol+ll==0)return printf("0"),0;int num0=0,num1=0;while(num0+c0<=oo)num0+=c0,c0++;while(num1+c1<=ll)num1+=c1,c1++;if(!lo&&!ol&&!oo)c0=0;if(!ll&&!lo&&!ol)c1=0;len=c1+c0;if(c1*c0!=lo+ol||num0!=oo||num1!=ll)return printf("Impossible"),0;for(int i=1;i<=len;i++){if(ol>=c1){printf("0");ol-=c1;c0--;}else{printf("1");lo-=c0;c1--;}}return 0;}


0 0
原创粉丝点击