在前往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;
}
}