#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)不能出现"11",那么2个'1'之间必然有1个'0'隔开——那么count('0')>=count('1') - 1;

    2)不能出现"001"那么当有2个'0'挨着时,之后的必须全是'0'——串是"1010........101"或者"010101.....010000....000"

    3)要求输出字典序最小的串,优先输出"010101.....010000....000"这种情况

    所以只用考虑三种情况:

    1)count('0') < count('1') - 1时,必然出现"11",输出"NO"

    2)count('0') = count('1') - 1时,只能输出"1010........101"

    3)count('0') >= count('1')时,优先输出"010101.....010000....000"

代码

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
    int n, m, i;
    cin >> n >> m;
    string str;

    if (n < (m - 1))
    {
        str = "NO";
    }

    else if(n == (m - 1))
    {
        for (i = 0; i < n; i++)
        {
            str += "10";
        }

        str += "1";
    }

    else
    {
        for (i = 0; i < m; i++)
        {
            str += "01";
        }

        for (i = 0; i < (n - m); i++)
        {
            str += "0";
        }
    }

    cout<< str <<endl;
}

 



posted on 2015-09-17 14:07  金融挨踢狗  阅读(239)  评论(0)    收藏  举报