题意:有n个零和m个一,把他们排成一排。规则如下:1不能有两个相邻的零,2不能有三个相邻的一。输出这样一个字符串。不行的话就输出1。
题解:假设零和一成立的话只有这两种情况:10,110 假设10为x个,110为y个。
则x=m-n.
y=2n-m.
接下来就有几种不同情况。当x<-1或者y<-2时肯定不成立的。
如果x==-1的话,就证明有一个零在第一个位置,接下来就是y-2个10了。
如果-2<=y<0的话,就会存在x+y个110和剩余的几个1。至于几个1就自己去想了,反正不会超过2,是滴啵。
接下来就是普通情况。有x个110,y个10了。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
#include <map>
#include <stack>
#include <list>
#include <vector>
using namespace std;
//#define DEBUG
int main()
{
#ifdef DEBUG
freopen("cin.txt", "r", stdin);
freopen("cout.txt", "w", stdout);
#endif
int n,m,i;
while (~scanf("%d%d",&n,&m))
{
int x=m-n;
int y=2*n-m;
if (y<-2 || x<-1)
{
printf("-1\n");
continue;
}
if (x==-1)
{
printf("0");
for (i=1;i<=y-2;i++)
printf("10");
printf("\n");
continue;
}
if (y<0)
{
for (i=1;i<=x+y;i++)
printf("110");
//n-=x+1;
m=m-2*(x+y);
for (i=1;i<=m;i++)
printf("1");
printf("\n");
continue;
}
for (i=1;i<=x;i++)
printf("110");
for (i=1;i<=y;i++)
printf("10");
printf("\n");
}
return 0;
}