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