1144 : 01串

时间限制:7000ms
单点时限:1000ms
内存限制:256MB

描述

给定两个整数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;
}

 

It is your time to fight!