GYM 101086 F.Hey JUDgE(枚举)

253 篇文章 2 订阅

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值