#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; }