题目大意
有 n n n 张扑克牌,求能组成几个由牌点一样且花色有且仅有两种的“小昕昕”。
题目解法
这个题目就是一道有点难度的桶思想的题目,需要用一个二维的数组来当桶,还要与贪心思想结合。
解题的过程主要分为两部分,第一部分是将扑克牌的信息存入道桶中,我用了两个函数处理花色和点数。
之后就是循环扫描桶的环节,首先最外层的循环是点数,之后要分为两种情况来处理。
认真看题目描述,发现只有两副牌,所以相同点数和花色的牌最多出现两张。
所以贪心的思想就是:
-
如果其中相同的点数正好有 2 + 1 2+1 2+1 个,也就是一种花色是有 2 2 2 张,另外一种有 1 1 1 张。此时我们将这两种花色对应的桶清零;
-
在排除完前面那种情况以后,还有一种情况,就是这两种花色都有 2 2 2 张,此时就要拆开其中一个来凑。此时我们其中一个的桶清零,另外一个减去一。
参考代码
#include<bits/stdc++.h>
using namespace std;
char s[3];
int book[15][5],ans;
int check1(char ch){
if(ch=='A') return 1;
if(ch=='T') return 10;
if(ch=='J') return 11;
if(ch=='Q') return 12;
if(ch=='K') return 13;
return ch-'0';
}
int check2(char ch){
if(ch=='S') return 1;
if(ch=='H') return 2;
if(ch=='C') return 3;
if(ch=='D') return 4;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>s+1;
book[check1(s[2])][check2(s[1])]++;
}
for(int i=1;i<=13;i++){
for(int j=1;j<=4;j++)
for(int k=1;k<=4;k++)
if(book[i][j]+book[i][k]==3){
ans++;
book[i][j]=0;
book[i][k]=0;
}
for(int j=1;j<=4;j++)
for(int k=j+1;k<=4;k++)
if(book[i][j]+book[i][k]>=3){
ans++;
if(book[i][j]==2) book[i][j]=0,book[i][k]--;
else if(book[i][k]==2) book[i][k]=0,book[i][j]--;
}
}
cout<<ans;
}