测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A30569. 扑克牌(poker)

填空题 较难

题目描述

扑克牌(poker)

题目描述

小P 从同学小Q 那儿借来一副 n 张牌的扑克牌。

本题中我们不考虑大小王,此时每张牌具有两个属性:花色和点数。花色共有 4 种: 方片、草花、红桃和黑桃。点数共有 13 种,从小到大分别为 A 2 3 4 5 6 7 8 9 T J Q K。注意:点数 10 在本题中记为 T。

我们称一副扑克牌是完整的,当且仅当对于每一种花色和每一种点数,都恰好有一 张牌具有对应的花色和点数。由此,一副完整的扑克牌恰好有 4 × 13 = 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 张牌。

样例 3

见选手目录下的 poker/poker3.in 与 poker/poker3.ans。

样例 3 解释

这一副扑克牌是完整的,故不需要再借任何牌。

该样例满足所有牌按照点数从小到大依次输入,点数相同时按照方片、草花、红桃、 黑桃的顺序依次输入。

参考答案

#include <iostream> #include <unordered_map> #include <string> using namespace std; unordered_map<string, int> mp; void solve() { int n; cin >> n; int ans = 52; for (int i = 0; i < n; i++) { string s; cin >> s; if (mp.find(s) == mp.end()) { ans--; } mp[s] = 1; } cout << ans << endl; } int main() { int t = 1; while (t--) solve(); return 0; }
上一题 下一题