扑克牌(poker)2024年CSP-J复赛第1题
扑克牌(poker)
【题目描述】
(说明:原题内容来自公众号NOI CSP信息学奥赛,由于原处为图片,本文为手机识别的结果,可能会有不同之处,请大家指出)
小P从同学小Q那儿借来一副 n 张牌的扑克牌。
本题中我们不考虑大小王,此时每张牌具有两个属性:花色和点数。花色共有4种:方片、草花、红桃和黑桃。点数共有13种,从小到大分别为A23456789T JQK。注意:点数10在本题中记为T。
我们称一副扑克牌是完整的,当且仅当对于每一种花色和每一种点数,都恰好有一张牌具有对应的花色和点数。由此,一副完整的扑克牌恰好有4x13=52张牌。以下图片展示了一副完整的扑克牌里所有的52张牌。
小P借来的牌可能不是完整的,为此小 P准备再向同学小S借若干张牌。可以认为小S每种牌都有无限张,因此小P可以任意选择借来的牌。小P想知道他至少得向小S借多少张牌,才能让从小S和小Q借来的牌中,可以选出52张牌构成一副完整的扑克牌。
为了方便你的输入,我们使用字符 D代表方片,字符C代表草花,字符H代表红桃,字符S代表黑桃,这样每张牌可以通过一个长度为2的字符串表示,其中第一个字符表示这张牌的花色,第二个字符表示这张牌的点数,例如CA表示草花A,ST表示黑桃T(黑桃10)。
【输入格式】
从文件poker.in 中读入数据。
输入的第一行包含一个整数n表示牌数。
接下来n行:
每行包含一个长度为2的字符串描述一张牌,其中第一个字符描述其花色,第二个字符描述其点数。
【输出格式】
输出到文件poker.out中。
输出一行一个整数,表示最少还需要向小S借几张牌才能凑成一副完整的扑克牌。
【样例1输入】
1
SA
【样例1输出】
51
【样例1解释】
这一副牌中包含一张黑桃A,小P还需要借除了黑桃 A 以外的51张牌以构成一副完整的扑克牌。
【样例2输入】
4
DQ
H3
DQ
DT
【样例2输出】
49
【样例2解释】
这一副牌中包含两张方片 Q、一张方片 T(方片10)以及一张红桃3,小P还需要借除了红桃3、方片T和方片Q以外的49张牌。
编程思路:
1.看到这种题目首先想到的就是用桶排序的原理。
2.把52张牌放入一个数组中,分类如下:
//花色 D[1-13] C[14-26] H[27-39] S[40-52]
//牌面 A 2 3 4 5 6 7 8 9 T J Q K
题目相对简单,直接上源码了:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 //花色 D[1-13] C[14-26] H[27-39] S[40-52] 5 //牌面 A 2 3 4 5 6 7 8 9 T J Q K 6 int puke[53] = {0}; 7 8 int main() { 9 freopen("poker.in", "r", stdin); 10 freopen("poker.out", "w", stdout); 11 int n; 12 cin >> n; 13 //读入数量 14 for (int i = 1; i <= n; i++) { 15 //读入n张 16 int index = 1; 17 char sort, val; 18 cin >> sort >> val; 19 string huase="DCHS";//花色序列 20 string paimian="A23456789TJQK";//版面序列 21 index=huase.find(sort)*13+paimian.find(val)+1; 22 puke[index]++; 23 } 24 n=52; 25 for(int i=1;i<=52;i++){ 26 if(puke[i]!=0)n--; 27 // cout<<puke[i]<<' '; 28 // if(i%13==0)cout<<endl; 29 } 30 cout<<n; 31 fclose(stdin); 32 fclose(stdout); 33 return 0; 34 }
这个题目就写到这里了,希望能帮到需要的人,也希望大家共同讨论