请你构造一个 01 序列,序列需要满足以下所有要求:
- 恰好包含 n 个 0 和 m 个 1。
- 不存在两个或两个以上的 0 连续相邻。
- 不存在三个或三个以上的 1 连续相邻。
输入格式
共一行,包含两个整数 n,m。
输出格式
输出共一行,如果存在满足条件的 01 序列,则输出满足条件的 01 序列,否则输出 -1
。
如果答案不唯一,则输出任意合理答案均可。
数据范围
前 6 个测试点满足 1≤n,m≤10。
所有测试点满足 1≤n,m≤10e6。
输入样例1:
1 2
输出样例1:
101
输入样例2:
4 8
输出样例2:
110110110101
输入样例3:
4 10
输出样例3:
11011011011011
输入样例4:
1 5
输出样例4:
-1
分析:首先这个题如果要用数组写的话,数组最大应该开到2*1e6.
刚开始自己写的时候并没有考虑到这种情况,虽然最后也没写出来
证明:
首先先判断n,m的关系
因为用1来判断n,m的关系不好判断,所以用0
由图可以看出至少需要 n - 1 个 1,也就是不包含两边的空挡
最多能放 2 *(n+1)个1,每个空挡放2个1
所以题目的条件必须满足 n - 1 <= m <= 2 * (n +1 )
下边说怎么构造
首先我们至少需要n-1个1使n个0隔开,然后依次从左往右输出,再判断每个空挡是否需要填1
填1的条件是m>n-1,因为当m的数量多于n-1,说明1的数量是多余的
#include<iostream>
using namespace std;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
if(m > 2*(n+1) || m < n-1) puts("-1");
else
{
for(int i=0;i<2;i++)
if(m > n-1)
{
printf("1");
m--;
}
while(n)
{
printf("0");
n--;
if(n)//如果此时n不是最后一个
{
printf("1");
m--;
if(m > n-1)
{
printf("1");
m--;
}
}
}
while(m--) printf("1");//因为此时绝对满足条件,所以只需把剩余的1输出就行
}
return 0;
}