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