扑克牌(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 }

这个题目就写到这里了,希望能帮到需要的人,也希望大家共同讨论

 

posted @ 2024-11-10 19:05  道非常道  阅读(227)  评论(0编辑  收藏  举报