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

来源:互联网 发布:批处理测试端口 编辑:程序博客网 时间:2024/06/06 03:23

题目链接: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 3000000using namespace std;#ifdef __int64typedef __int64 LL;#elsetypedef long long LL;#endifint 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;}


0 0