Codeforces Round #235 (Div. 2) C Team 构造法

本文解析了CodeForces上的一道题目,该题要求输出特定格式的0和1序列,同时避免出现连续三个1或相邻的0。文章详细阐述了解题思路,并提供了一段C++代码实现,通过四种特殊情况的判断来解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://codeforces.com/contest/401/problem/C

题目大意:输入两个整数n,m。n代表0的个数,m代表1的个数。要求输出一串数字(只包含0与1),且0不能相邻,三个1不能连续。如果无解则输出-1.

解题思路:

先判断无解的状态,当这串数字是这样的时候:11011011.....011  此时的0的个数是最少的,即2*n+2==m,化简得到:2*n+2>=m

当这串数字是这样的时候:0101010....010 此时的0的个数是最多的,即m==n-1,化简得到:m>=n-1

还有几种状态需要特别判断一下:

1、类似11011011...  此时 m==n*2+2

2、类似110......1101 此时 m==n*2+1

3、当n>m

4、当n<m

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<vector>
#include<algorithm>
#include<iostream>
#define maxn 3000000
using namespace std;
#ifdef __int64
typedef __int64 LL;
#else
typedef long long LL;
#endif
int n,m;
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        if(m<n-1||m>2*n+2)//排除无解的情况
            printf("-1\n");
        else
        {
            if(m==n*2+2)//情况一
            {
                for(int i=1;i<=n;i++)
                {
                    printf("110");
                }
                printf("11\n");
            }
            else if(m==n*2+1)//情况二
            {
                for(int i=1;i<=n;i++)
                {
                    printf("110");
                }
                printf("1\n");
            }
            else if(n>m)//情况三
            {
                while(n>m)
                {
                    printf("010");
                    n-=2;
                    m--;
                }
                for(int i=1;i<=n;i++)
                    printf("10");
                printf("\n");
            }
            else//情况四
            {
                while(m>n)
                {
                    printf("110");
                    m-=2;
                    n--;
                }
                for(int i=1;i<=n;i++)
                    printf("10");
                printf("\n");
            }
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值