ZCC loves straight flush
Accepts: 167
Submissions: 726
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 131072/65536 K (Java/Others)
问题描述
在前往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 12
分析:同花顺的情况不多,不妨枚举所有同花顺的情况,看五张牌中有几张已经在给出的牌中出现了,剩下的牌就是必须要换掉的。枚举同花顺时,可以先枚举花色,再枚举顺子中最小的牌。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 20 int vis[N][N]; char s[N]; int n; int main() { scanf("%d",&n); while(n--) { memset(vis,0,sizeof(vis)); int i,j,k; for(i=0; i<5; i++) { scanf("%s",s); int l=strlen(s); int t; if(l==3) { t=(s[1]-'0')*10+(s[2]-'0'); } else { t=s[1]-'0'; } if(s[0]=='A') { vis[1][t]++; } else if(s[0]=='B') { vis[2][t]++; } else if(s[0]=='C') { vis[3][t]++; } else { vis[4][t]++; } } int ans=0; for(i=1;i<=4;i++) { for(j=1;j<=9;j++) { int temp=0; for(k=0;k<5;k++) { if(vis[i][j+k]) { temp++; } } ans=max(temp,ans); } int temp=0; for(j=10;j<=13;j++) { if(vis[i][j]) { temp++; } } if(vis[i][1]) { temp++; } ans=max(temp,ans); } printf("%d\n",5-ans); } return 0; }