【codeforce 708e】Recover the String

7 篇文章 0 订阅

每一次写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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值