[CSP-J 2024] 扑克牌
题目描述
小 P 从同学小 Q 那儿借来一副 n n n 张牌的扑克牌。
本题中我们不考虑大小王,此时每张牌具有两个属性:花色和点数。花色共有 4 4 4 种:方片、草花、红桃和黑桃。点数共有 13 13 13 种,从小到大分别为 A 23456789 T J Q K \tt{A 2 3 4 5 6 7 8 9 T J Q K} A23456789TJQK。注意:点数 10 10 10 在本题中记为 T \tt T T。
我们称一副扑克牌是完整的,当且仅当对于每一种花色和每一种点数,都恰好有一张牌具有对应的花色和点数。由此,一副完整的扑克牌恰好有
4
×
13
=
52
4 \times 13 = 52
4×13=52 张牌。以下图片展示了一副完整的扑克牌里所有的 52 张牌。
小 P 借来的牌可能不是完整的,为此小 P 准备再向同学小 S 借若干张牌。可以认为小 S 每种牌都有无限张,因此小 P 可以任意选择借来的牌。小 P 想知道他至少得向小 S 借多少张牌,才能让从小 S 和小 Q 借来的牌中,可以选出 52 52 52 张牌构成一副完整的扑克牌。
为了方便你的输入,我们使用字符 D \tt D D 代表方片,字符 C \tt C C 代表草花,字符 H \tt H H 代表红桃,字符 S \tt S S 代表黑桃,这样每张牌可以通过一个长度为 2 2 2 的字符串表示,其中第一个字符表示这张牌的花色,第二个字符表示这张牌的点数,例如 C A \tt{CA} CA 表示草花 A \tt A A, S T \tt{ST} ST 表示黑桃 T \tt T T(黑桃 10)。
输入格式
输入的第一行包含一个整数 n n n 表示牌数。
接下来 n n n 行:
每行包含一个长度为 2 2 2 的字符串描述一张牌,其中第一个字符描述其花色,第二个字符描述其点数。
输出格式
输出一行一个整数,表示最少还需要向小 S 借几张牌才能凑成一副完整的扑克牌。
样例 #1
样例输入 #1
1
SA
样例输出 #1
51
样例 #2
样例输入 #2
4
DQ
H3
DQ
DT
样例输出 #2
49
提示
【样例 1 解释】
这一副牌中包含一张黑桃 A \tt A A,小 P 还需要借除了黑桃 A \tt A A 以外的 51 张牌以构成一副完整的扑克牌。
【样例 2 解释】
这一副牌中包含两张方片 Q \tt Q Q、一张方片 T \tt T T(方片 10)以及一张红桃 3,小 P 还需要借除了红桃 3、方片 T \tt T T 和方片 Q \tt Q Q 以外的 49 49 49 张牌。
【样例 3 解释】
见选手目录下的 poker/poker3.in 与 poker/poker3.ans。
这一副扑克牌是完整的,故不需要再借任何牌。
该样例满足所有牌按照点数从小到大依次输入,点数相同时按照方片、草花、红桃、黑桃的顺序依次输入。
【数据范围】
对于所有测试数据,保证: 1 ≤ n ≤ 52 1 \leq n \leq 52 1≤n≤52,输入的 n n n 个字符串每个都代表一张合法的扑克牌,即字符串长度为 2 2 2,且第一个字符为 D C H S \tt{D C H S} DCHS 中的某个字符,第二个字符为 A 23456789 T J Q K \tt{A 2 3 4 5 6 7 8 9 T J Q K} A23456789TJQK 中的某个字符。
测试点编号 | n ≤ n \leq n≤ | 特殊性质 |
---|---|---|
1 1 1 | 1 1 1 | A |
2 ∼ 4 2\sim 4 2∼4 | 52 52 52 | A |
5 ∼ 7 5\sim 7 5∼7 | 52 52 52 | B |
8 ∼ 10 8\sim 10 8∼10 | 52 52 52 | 无 |
特殊性质 A:保证输入的 n n n 张牌两两不同。
特殊性质 B:保证所有牌按照点数从小到大依次输入,点数相同时按照方片、草花、红桃、黑桃的顺序依次输入。
题解
#include<bits/stdc++.h>
#define i64 long long
using namespace std;
string a;
int D[13]={0},C[13]={0},H[13]={0},S[13]={0};
int sum=0;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;++i){
cin>>a;
if(a[0]=='D'){
if(a[1]=='A') D[0]++;
if(a[1]=='2') D[1]++;
if(a[1]=='3') D[2]++;
if(a[1]=='4') D[3]++;
if(a[1]=='5') D[4]++;
if(a[1]=='6') D[5]++;
if(a[1]=='7') D[6]++;
if(a[1]=='8') D[7]++;
if(a[1]=='9') D[8]++;
if(a[1]=='T') D[9]++;
if(a[1]=='J') D[10]++;
if(a[1]=='Q') D[11]++;
if(a[1]=='K') D[12]++;
}else if(a[0]=='C'){
if(a[1]=='A') C[0]++;
if(a[1]=='2') C[1]++;
if(a[1]=='3') C[2]++;
if(a[1]=='4') C[3]++;
if(a[1]=='5') C[4]++;
if(a[1]=='6') C[5]++;
if(a[1]=='7') C[6]++;
if(a[1]=='8') C[7]++;
if(a[1]=='9') C[8]++;
if(a[1]=='T') C[9]++;
if(a[1]=='J') C[10]++;
if(a[1]=='Q') C[11]++;
if(a[1]=='K') C[12]++;
}else if(a[0]=='H'){
if(a[1]=='A') H[0]++;
if(a[1]=='2') H[1]++;
if(a[1]=='3') H[2]++;
if(a[1]=='4') H[3]++;
if(a[1]=='5') H[4]++;
if(a[1]=='6') H[5]++;
if(a[1]=='7') H[6]++;
if(a[1]=='8') H[7]++;
if(a[1]=='9') H[8]++;
if(a[1]=='T') H[9]++;
if(a[1]=='J') H[10]++;
if(a[1]=='Q') H[11]++;
if(a[1]=='K') H[12]++;
}else if(a[0]=='S'){
if(a[1]=='A') S[0]++;
if(a[1]=='2') S[1]++;
if(a[1]=='3') S[2]++;
if(a[1]=='4') S[3]++;
if(a[1]=='5') S[4]++;
if(a[1]=='6') S[5]++;
if(a[1]=='7') S[6]++;
if(a[1]=='8') S[7]++;
if(a[1]=='9') S[8]++;
if(a[1]=='T') S[9]++;
if(a[1]=='J') S[10]++;
if(a[1]=='Q') S[11]++;
if(a[1]=='K') S[12]++;
}
}
for(int i=0;i<=13;++i){ //遍历每种花色
if(D[i]>0) sum++;
}for(int i=0;i<=13;++i){
if(C[i]>0) sum++;
}for(int i=0;i<=13;++i){
if(H[i]>0) sum++;
}for(int i=0;i<=13;++i){
if(S[i]>0) sum++;
}
cout<<52-sum<<endl;
return 0;
}