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

题目链接: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;
}


你可能感兴趣的:(Codeforces Round #235 (Div. 2) C Team 构造法)