[CSP-J 2024] 扑克牌 题解

[CSP-J 2024] 扑克牌 原题

题目描述

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

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

我们称一副扑克牌是完整的,当且仅当对于每一种花色和每一种点数,都恰好有一张牌具有对应的花色和点数。由此,一副完整的扑克牌恰好有 4×13=524 \times 13 = 524×13=52 张牌。以下图片展示了一副完整的扑克牌里所有的 525252 张牌。

在这里插入图片描述

小 P 借来的牌可能不是完整的,为此小 P 准备再向同学小 S 借若干张牌。可以认为小 S 每种牌都有无限张,因此小 P 可以任意选择借来的牌。小 P 想知道他至少得向小 S 借多少张牌,才能让从小 S 和小 Q 借来的牌中,可以选出 525252 张牌构成一副完整的扑克牌。

为了方便你的输入,我们使用字符 D\tt DD 代表方片,字符 C\tt CC 代表草花,字符 H\tt HH 代表红桃,字符 S\tt SS 代表黑桃,这样每张牌可以通过一个长度为 222 的字符串表示,其中第一个字符表示这张牌的花色,第二个字符表示这张牌的点数,例如 CA\tt{CA}CA 表示草花 A\tt AAST\tt{ST}ST 表示黑桃 T\tt TT(黑桃 10)。

输入格式

输入的第一行包含一个整数 nnn 表示牌数。

接下来 nnn 行:

每行包含一个长度为 222 的字符串描述一张牌,其中第一个字符描述其花色,第二个字符描述其点数。

输出格式

输出一行一个整数,表示最少还需要向小 S 借几张牌才能凑成一副完整的扑克牌。

样例 #1

输入

1
SA

输出

51

样例 #2

输入

4
DQ
H3
DQ
DT

输出

49

提示

【样例 1 解释】

这一副牌中包含一张黑桃 A\tt AA,小 P 还需要借除了黑桃 A\tt AA 以外的 515151 张牌以构成一副完整的扑克牌。

【样例 2 解释】

这一副牌中包含两张方片 Q\tt QQ、一张方片 T\tt TT(方片 10)以及一张红桃 3,小 P 还需要借除了红桃 3、方片 T\tt TT 和方片 Q\tt{Q}Q 以外的 494949 张牌。

【数据范围】

对于所有测试数据,保证:1≤n≤521 \leq n \leq 521n52,输入的 nnn 个字符串每个都代表一张合法的扑克牌,即字符串长度为 222,且第一个字符为 D,C,H,S\tt{D, C, H, S}D,C,H,S 中的某个字符,第二个字符为 A,2,3,4,5,6,7,8,9,T,J,Q,K\tt{A, 2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K}A,2,3,4,5,6,7,8,9,T,J,Q,K 中的某个字符。

特殊性质 A:保证输入的 nnn 张牌两两不同。

特殊性质 B:保证所有牌按照点数从小到大依次输入,点数相同时按照方片、草花、红桃、黑桃的顺序依次输入。

在这里插入图片描述

本题不难,废的笔墨有点多,开考的时候我是写了100多行代码。

其实解题很简单,不用太多脑筋。本题只需要把所有牌存入数组,然后判断元素空与否即可。

本题不用说太多了吧,二维数组或四个一位数组都可以,大家哪个习惯用哪个。

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的,汗水没白费。

​Updates

2025/7/32025/7/32025/7/3 加入了 LaTeX\LaTeXLATEX 的优化。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值