hdu 5228 ZCC loves straight flush && BestCoder Round #41 1001

在前往ZJOI2015一试的路上,ZCC在同Fsygd打德州扑克时输光了所有的筹码。不过ZCC最近学会了一些黑技术。现在,他能够在游戏过程中更换任何他想要更换的牌。ZCC想要通过更换尽量少的牌得到同花顺。

称五张牌构成了同花顺,当且仅当它们的数值连续,花色一致。请告诉ZCC他至少需要更换多少张牌。

在题目中,牌的花色用一个大写字母('A', 'B', 'C', 'D')来表示,而数值用数字('1', '2', 
  
  
   
   
  
  , '13')来表示。

注意数字1代表ace,在德州扑克中是最大的牌。"1 2 3 4 5" 和 "10 11 12 13 1" 都被认为是连续的。而"11 12 13 1 2"并不是。
输入描述
第一行仅有一个整数T(
  
  
   
   T=1000
  
  )代表数据组数。
对于每组数据,在一行中有五个字符串代表五张牌。数据保证所有的牌都是不同的。
输出描述
对于每组数据,输出在单独的一行中的一个整数代表答案。
输入样例
3
A1 A2 A3 A4 A5
A1 A2 A3 A4 C5
A9 A10 C11 C12 C13
输出样例
0
1
2
题解:

和官方的差不多

总结:

1.这个题目最后也没有做出来,开始想的方法是:枚举保留的手牌,但是对于有重复大小的手牌就不方便讨论了

2.比赛结束后才想到可以枚举所有的最终胜利情况

3.这个题目并没有稍加考虑就急于编写了,犯了老毛病

4.考虑问题依旧不够全面,枚举只能是(1).枚举保留手牌,(2).枚举胜利结果。如果一下就想清楚这些事情可能

就可以及早找到更好的解决方法


#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 5
int has[13 * 4];
char s[5];
int main()
{
    int _;
    scanf("%d",&_);
    while(_--)
    {
        memset(has,0,sizeof(has));
        for(int i = 0;i < 5;i++)
        {
            scanf("%s",s);
            int cur;
            if(strlen(s) == 3)
            {
                cur = (s[1] - '0') * 10 + s[2] - '0';
            }
            else
            {
                cur = s[1] - '0';
            }
            cur--;
            has[cur * 4 + s[0] - 'A']++;
        }
        int ans = 5;
        for(int i = 0;i < 10;i++)
        {
            for(int j = 0;j < 4;j++)
            {
                int cnt = 5;
                for(int k = 0;k < 5;k++)
                {
                    int num = (i + k) * 4 + j;
                    if(has[num % (13 * 4)])cnt--;
                }
                ans = min(ans,cnt);
            }
        }
        cout << ans << endl;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值