1144 : 01串
描述
给定两个整数n和m,求是否存在恰好包含n个0和m个1的01串S,使得S中不存在子串"001"和"11"。
如果存在符合条件的01串则输出字典序最小的S,否则输出NO。
输入
一行两个整数,表示n和m。(0<=n,m<=100000,0<n+m)
输出
一行一个字符串,为字典序最小的S或者NO。
- 样例输入
-
2 3
- 样例输出
-
10101
要想字典序最小,那么从后向前,尽可能放1。
不能有001和11(即011,111也不行)。那么含1的单位只能是...101...,也就是第n为放1,那么n-2也必须是1。某一位放1后,它会101延续到第一位或者第二位。即满足条件的应该满足:
101010...1010
101010...0000
010101...0101
010101...0000
所以只要从第二位或者第一位开始验证即可。
#include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #include<cstring> using namespace std; int main() { int n,m,i,j; scanf("%d%d",&n,&m); if(m-1>n) printf("NO\n"); else if(m<=n){//第二位 printf("0"); n--; for(i=1;i<=m-1;i++) printf("10"); if(m>0)printf("1"); for(i=m;i<=n;i++) if(i>0)printf("0"); } else {//第一位 for(i=1;i<=m-1;i++) printf("10"); if(m>0)printf("1"); for(i=m;i<=n;i++) if(i>0)printf("0"); } return 0; }