1263: Argb0n
时间限制: 1 Sec 内存限制: 128 MB提交: 32 解决: 7
[ 提交][ 状态][ 讨论版]
题目描述
Argb0n 是 AR 老师的好朋友,他给了你一个问题:
给定两排 LED 灯,每排 n 个,有没有可能交换其中任意个灯,
使得红色与红色不能相邻,绿色和蓝色不能相邻。
相邻可以是 上下相邻 或者 左右相邻。
输入
第一行 T,(T <= 50) 表示有 T 组数据
每组数据第一行 n (n <= 10000)
接下来 2 行,每行 n 个字母(只包含 R G B 三种大写字母)
输出
对于每组数据,如果可能,输出 YES。否则输出 NO。
样例输入
4
3
RRR
GGB
3
RRR
GRB
5
GBRGB
RGBRG
2
RG
GB
样例输出
YES
NO
YES
NO
思路:这道题要找规律啊!可以先考虑灯的数量较多时,红灯的数量入手。
上代码:
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
using namespace std;
char a[10010];
char b[10010];
int main()
{
int t,tem,n,i,j,k,R,G,B;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%d",&tem);
getchar();
R=G=B=0;
n=2*tem;
gets(a);
gets(b);
for(i=0;i<tem;i++)
{
if(a[i]=='R')
R++;
if(a[i]=='G')
G++;
if(a[i]=='B')
B++;
}
for(i=0;i<tem;i++)
{
if(b[i]=='R')
R++;
if(b[i]=='G')
G++;
if(b[i]=='B')
B++;
}
if(n>=6)
{
if(R>n/2) //红灯大于一半是不可能的
printf("NO\n");
if(R>=3&&R<=n/2) //自己画图推一下
printf("YES\n");
if(R==2) //红色在中间,蓝绿在两边
{
if(G%2==1&&B%2==1)
printf("YES\n");
if(G%2==0&&B%2==0&&G!=0&&B!=0)
printf("NO\n");
if(G%2==0&&B%2==0&&(G==0||B==0))
printf("YES\n");
}
if(R==1)
{
if(G==0||B==0)
printf("YES\n");
else
printf("NO\n");
}
if(R==0)
{
if(G==0||B==0)
printf("YES\n");
else
printf("NO\n");
}
}
if(n==4) //n较小时直接画图即可
{
if(R>=3)
printf("NO\n");
if(R==2)
printf("YES\n");
if(R==1)
{
if(G==0||B==0)
printf("YES\n");
else
printf("NO\n");
}
if(R==0)
{
if(G==0||B==0)
printf("YES\n");
else
printf("NO\n");
}
}
if(n==2)
{
if(R==2)
printf("NO\n");
if(G==2)
printf("YES\n");
if(B==2)
printf("YES\n");
if(R==1&&B==1)
printf("YES\n");
if(R==1&&G==1)
printf("YES\n");
if(G==1&&B==1)
printf("NO\n");
}
if(n==0)
printf("YES\n");
}
return 0;
}