算法原题来自:hihocoder
你可以在我的github获取源码:https://github.com/Wtango/hihocoder
给定两个整数n和m,求是否存在恰好包含n个0和m个1的01串S,使得S中不存在子串”001″和”11″。如果存在符合条件的01串则输出字典序最小的S,否则输出NO。
我们进行分类讨论:
- 当m > n+1时,永远无法满足 “不存在11字串“条件
- 当m = n+1时,只有1010101… 这样的的串满足条件
- 当m <= n时,最小字典序出现的情况则是010101…0000,在这种情况下必须出现成对的01直到1耗完为止,则可保证不存在”001″子串。
#include <stdio.h>
int main()
{
int n,m;
scanf("%d%d",&n,&m);
if(m > (n + 1)) {
printf("NO\n");
return 0;
}
if(m == (n + 1)) {
putchar('1');
while(--m) {
putchar('0');
putchar('1');
}
putchar('\n');
return 0;
}
int nz = n - m;
while(m--) {
putchar('0');
putchar('1');
}
while(nz--) {
putchar('0');
}
putchar('\n');
return 0;
}