博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Recover the String
阅读量:5898 次
发布时间:2019-06-19

本文共 1272 字,大约阅读时间需要 4 分钟。

Recover the String

题目链接:

构造

这题乍一看很难构造,但是如果知道了整个字符串中'0'和'1'的个数n0和n1,就很好构造了:

1.将整个字符串填满'1',在所有的1右边填x个'0',那么'10'就有x*n1个了,一直填到还需要'10'的个数t1小于n1个;

2.再从右边数n1-t1个'1'并在它前面添加一个'0';

3.删去多余的'1'.

如此看来,构造并不困难,难的是判断何时Impossible.我们可以看到a1和a4必须是(1+n)*n/2的形式,而a2+a3肯定等于n0*n1(对于每一个'1',若左边有x个'0',那么右边有n0-x个'0')。但是这样直接交还会WA,还有一种情况没有考虑:只有'1'或只有'0'的情况,这种情况特判就好啦。

代码如下:

1 #include
2 #include
3 using namespace std; 4 int a,b,c,d; 5 char s[1000005]; 6 int main(void){ 7 scanf("%d%d%d%d",&a,&b,&c,&d); 8 if(a+b+c+d==0){ 9 printf("1\n");10 return 0;11 }12 int n0=(int)sqrt(2*a)+1;13 if(n0*(n0-1)/2!=a){14 printf("Impossible\n");15 return 0;16 }17 int n1=(int)sqrt(2*d)+1;18 if(n1*(n1-1)/2!=d){19 printf("Impossible\n");20 return 0;21 }22 if(n0+n1>1000000){23 printf("Impossible\n");24 return 0;25 }26 if(c+b+d==0){27 for(int i=0;i
=0;--i){49 if(k==n1-t1){50 s[i]='0';51 break;52 }53 if(s[i]=='1')k++;54 }55 for(;i>=0;--i){56 if(s[i]=='1')k++;57 if(k>n1)s[i]='0';58 }59 printf("%s\n",s);60 }

 

转载于:https://www.cnblogs.com/barrier/p/5806446.html

你可能感兴趣的文章
泉州电信推进渠道互联网化转型
查看>>
影响云计算核心问题的七个要素
查看>>
《BackTrack 5 Cookbook中文版——渗透测试实用技巧荟萃》—第3章3.6节识别操作系统...
查看>>
提供给开发者的 20 款最棒的 jQuery Bootstrap 插件 【已翻译100%】
查看>>
linux系统防火墙iptables命令规则及配置的示例
查看>>
10 个顶尖的 Linux 开源人工智能工具
查看>>
传 Android N 或取消沿用多年的应用抽屉
查看>>
Firefox 跟踪保护技术将页面加载时间减少 44%
查看>>
聚合(根)、实体、值对象精炼思考总结
查看>>
Hibernate从入门到放弃(三)----持久化对象
查看>>
Aop RealProxy 千年遇BUG
查看>>
java解析虾米音乐
查看>>
rails将类常量重构到数据库对应的表中之三
查看>>
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
查看>>
android本地音乐播放器
查看>>
泛函编程(37)-泛函Stream IO:通用的IO处理过程-Free Process
查看>>
mysql 多行合并函数
查看>>
【案例】RAID卡写策略改变引发的问题
查看>>
AFNetworking 2.5.x 网络请求的封装
查看>>
Velocity魔法堂系列三:模板与宿主环境通信
查看>>