Description
有
n
个小孩围成一个环,其中旁边有男孩子的有
Input
三个整数
Output
如果存在合法方案则按顺时针或逆时针方向输出孩子的站序,以
B
表示男孩,以
Sample Input
10 5 7
Sample Output
BGBGBGBGGG
Solution
一个孩子的状态只有三种,两边都是男孩,两边都是女孩,一边是男孩一边是女孩,分别设其数量为
a,b,c
,则有
a+b+c=n,a+c=x,b+c=y
,解得
c=x+y−n
,注意到
a,b,c≥0
,故
a,b,c
均需非负且
a,b≥c
,同时,整个序列必然可以拆成若干段,每一段孩子性别相同,相邻段孩子性别不同,同一段除两端的孩子外,每个孩子的两边孩子性别相同的,而两端的孩子的两边孩子性别是不同的,故只要一段的长度超过
1
,则必然会有两个孩子属于
令
x=a−c,y=b−c,c=c/2
,则此时
x,y,c
的意义分别是两边都是男孩的孩子数量,两边都是女孩的孩子数量,长度超过
1
的段的数量,分
1.
c
是偶数,由于
2.
c
是奇数,类似
3.
c=1
,说明只有一个长度超过
1
的基本段,假设该基本段为
Code
#include<cstdio>
#include<algorithm>
using namespace std;
int Solve(int n,int x,int y)
{
int bg=x+y-n;
char b='B',g='G';
if(bg<0||bg&1||x<bg||y<bg)return 0;
if(!bg)
{
if(x==y)for(int i=0;i<x;i++)printf("BG");
else if(x==n)for(int i=0;i<n;i++)printf("B");
else if(y==n)for(int i=0;i<n;i++)printf("G");
else return 0;
}
else
{
x-=bg,y-=bg,bg/=2;
if(bg==1)
{
if(x==y)return 0;
if(x<y)swap(x,y),swap(b,g);
for(int i=1;i<=y;i++)printf("%c%c",g,b);
printf("%c",g);
for(int i=1;i<=n-2*y-1;i++)printf("%c",b);
}
else
{
if(bg&1)
{
if(x==0&&y==0)return 0;
if(x==0)swap(x,y),swap(b,g);
for(int i=1;i<=x+1;i++)printf("%c",b);
for(int i=1;i<=y+2;i++)printf("%c",g);
for(int i=1;i<=bg/2-1;i++)printf("%c%c%c%c",b,b,g,g);
printf("%c%c%c",b,b,g);
}
else
{
for(int i=1;i<=x+2;i++)printf("%c",b);
for(int i=1;i<=y+2;i++)printf("%c",g);
for(int i=1;i<=bg/2-1;i++)printf("%c%c%c%c",b,b,g,g);
}
}
}
printf("\n");
}
int main()
{
freopen("boysgirls.in","r",stdin);
freopen("boysgirls.out","w",stdout);
int n,x,y;
while(~scanf("%d%d%d",&n,&x,&y))
if(!Solve(n,x,y))printf("Impossible\n");
return 0;
}