构造序列(模拟构造)

请你构造一个 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值