您的位置:首页 > 其它

GYM 101086 F.Hey JUDgE(枚举)

2017-03-23 15:38 190 查看
Description

出了七道题,A~E,两个题可以组合成一道题,类似A+A=B这样,但是不能拿一个组合后得到的题和另一道题组合,一道题最多组合一次,问这七道题是否可以凑齐ABCDE

Input

第一行一整数T表示用例组数,每组用例输入一个长度为七的由A~E组成的字符串(1<=T<=330)

Output

如果这七道题通过适当的组合可以凑齐ABCDE则输出YES,否则输出NO

Sample Input

3

EBEABDA

CEDEACA

BDAAEAA

Sample Output

YES

NO

YES

Solution

三种情况:

1.ABCDE都有,不需要组合,YES

2.把两道题合成一道,C(7,2)的枚举即可

3.把四道题合成两道,C(7,2)*C(5,2)枚举即可

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 11
char s[maxn];
int T,num[maxn];
int main()
{
scanf("%d",&T);
while(T--)
{
memset(num,0,sizeof(num));
scanf("%s",s);
int gg=0;
for(int i=0;i<7;i++)num[s[i]-'A'+1]++;
for(int i=1;i<=5;i++)
if(!num[i])gg=1;
if(gg)
{
for(int i=0;i<7;i++)
for(int j=i+1;j<7;j++)
{
int a=s[i]-'A'+1,b=s[j]-'A'+1,flag=1;
num[a]--,num[b]--,num[a+b]++;
for(int k=1;k<=5;k++)
if(!num[k])flag=0;
if(flag)gg=0;
num[a]++,num[b]++,num[a+b]--;
}
if(gg)
{
for(int i=0;i<7;i++)
for(int j=i+1;j<7;j++)
for(int ii=0;ii<7;ii++)
for(int jj=ii+1;jj<7;jj++)
if(i!=ii&&i!=jj&&j!=ii&&j!=jj)
{
int a=s[i]-'A'+1,b=s[j]-'A'+1,c=s[ii]-'A'+1,d=s[jj]-'A'+1,flag=1;
num[a]--,num[b]--,num[a+b]++;
num[c]--,num[d]--,num[c+d]++;
for(int k=1;k<=5;k++)
if(!num[k])flag=0;
if(flag)gg=0;
num[a]++,num[b]++,num[a+b]--;
num[c]++,num[d]++,num[c+d]--;
}
}
}
printf("%s\n",gg?"NO":"YES");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: