[CSP-J 2024] 扑克牌 题解
小 P 从同学小 Q 那儿借来一副 \(n\) 张牌的扑克牌。本题中我们不考虑大小王,此时每张牌具有两个属性:花色和点数。花色共有 \(4\) 种:方片、草花、红桃和黑桃。点数共有 \(13\) 种,从小到大分别为 \(\tt{ {A, 2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K} }\)。注意:点数 \(10\) 在本题中记为 \(\tt T\)。我们称一副扑克牌是完整
[CSP-J 2024] 扑克牌 原题
题目描述
小 P 从同学小 Q 那儿借来一副 \(n\) 张牌的扑克牌。
本题中我们不考虑大小王,此时每张牌具有两个属性:花色和点数。花色共有 \(4\) 种:方片、草花、红桃和黑桃。点数共有 \(13\) 种,从小到大分别为 \(\tt{ {A, 2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K} }\)。注意:点数 \(10\) 在本题中记为 \(\tt T\)。
我们称一副扑克牌是完整的,当且仅当对于每一种花色和每一种点数,都恰好有一张牌具有对应的花色和点数。由此,一副完整的扑克牌恰好有 \(4 \times 13 = 52\) 张牌。以下图片展示了一副完整的扑克牌里所有的 \(52\) 张牌。
小 P 借来的牌可能不是完整的,为此小 P 准备再向同学小 S 借若干张牌。可以认为小 S 每种牌都有无限张,因此小 P 可以任意选择借来的牌。小 P 想知道他至少得向小 S 借多少张牌,才能让从小 S 和小 Q 借来的牌中,可以选出 \(52\) 张牌构成一副完整的扑克牌。
为了方便你的输入,我们使用字符 \(\tt D\) 代表方片,字符 \(\tt C\) 代表草花,字符 \(\tt H\) 代表红桃,字符 \(\tt S\) 代表黑桃,这样每张牌可以通过一个长度为 \(2\) 的字符串表示,其中第一个字符表示这张牌的花色,第二个字符表示这张牌的点数,例如 \(\tt{CA}\) 表示草花 \(\tt A\),\(\tt{ST}\) 表示黑桃 \(\tt T\)(黑桃 10)。
输入格式
输入的第一行包含一个整数 \(n\) 表示牌数。
接下来 \(n\) 行:
每行包含一个长度为 \(2\) 的字符串描述一张牌,其中第一个字符描述其花色,第二个字符描述其点数。
输出格式
输出一行一个整数,表示最少还需要向小 S 借几张牌才能凑成一副完整的扑克牌。
样例 #1
输入
1
SA
输出
51
样例 #2
输入
4
DQ
H3
DQ
DT
输出
49
提示
【样例 1 解释】
这一副牌中包含一张黑桃 \(\tt A\),小 P 还需要借除了黑桃 \(\tt A\) 以外的 \(51\) 张牌以构成一副完整的扑克牌。
【样例 2 解释】
这一副牌中包含两张方片 \(\tt Q\)、一张方片 \(\tt T\)(方片 10)以及一张红桃 3,小 P 还需要借除了红桃 3、方片 \(\tt T\) 和方片 \(\tt Q\) 以外的 \(49\) 张牌。
【数据范围】
对于所有测试数据,保证:\(1 \leq n \leq 52\),输入的 \(n\) 个字符串每个都代表一张合法的扑克牌,即字符串长度为 \(2\),且第一个字符为 \(\tt{D, C, H, S}\) 中的某个字符,第二个字符为 \(\tt{A, 2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K}\) 中的某个字符。
特殊性质 A:保证输入的 \(n\) 张牌两两不同。
特殊性质 B:保证所有牌按照点数从小到大依次输入,点数相同时按照方片、草花、红桃、黑桃的顺序依次输入。
本题不难,废的笔墨有点多,开考的时候我是写了100多行代码。
其实解题很简单,不用太多脑筋。本题只需要把所有牌存入数组,然后判断元素空与否即可。
本题不用说太多了吧,二维数组或四个一位数组都可以,大家哪个习惯用哪个。
\(\text{AC代码}\)
#include <iostream>
using namespace std;
int d[14], c[14], h[14], s[14];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
char x, y;
cin >> x >> y;
if (x == 'D') {
if (y > '1' && y <= '9') {
d[y-'0']++;
}
if (y == 'A') {
d[1]++;
}
if (y == 'J') {
d[11]++;
}
if (y == 'Q') {
d[12]++;
}
if (y == 'K') {
d[13]++;
}
if (y == 'T') {
d[10]++;
}
} else if (x =='C') {
if (y > '1' && y <= '9') {
c[y-'0']++;
}
if (y == 'A') {
c[1]++;
}
if (y == 'J') {
c[11]++;
}
if (y == 'Q') {
c[12]++;
}
if (y == 'K') {
c[13]++;
}
if (y == 'T') {
c[10]++;
}
} else if (x == 'H') {
if (y > '1' && y <= '9') {
h[y-'0']++;
}
if (y == 'A') {
h[1]++;
}
if (y == 'J') {
h[11]++;
}
if (y == 'Q') {
h[12]++;
}
if (y == 'K') {
h[13]++;
}
if (y == 'T') {
h[10]++;
}
} else if (x == 'S') {
if (y > '1' && y <= '9') {
s[y-'0']++;
}
if (y == 'A') {
s[1]++;
}
if (y == 'J') {
s[11]++;
}
if (y == 'Q') {
s[12]++;
}
if (y == 'K') {
s[13]++;
}
if (y == 'T') {
s[10]++;
}
}
}
int ans = 0;
for (int i = 1; i <= 13; i++) {
if (d[i] == 0) ans++;
}
for (int i = 1; i <= 13; i++) {
if (s[i] == 0) ans++;
}
for (int i = 1; i <= 13; i++) {
if (h[i] == 0) ans++;
}
for (int i = 1; i <= 13; i++) {
if (c[i] == 0) ans++;
}
cout << ans;
return 0;
}
瞧!虽然100多行代码,但是测试出来是AC的,汗水没白费。
更多推荐
所有评论(0)