CSP-J2024年T1题解

 [CSP-J 2024 -- T1] 扑克牌

内存限制:256 MiB时间限制:1000 ms输入文件:poker.in输出文件:poker.out

题目类型:传统评测方式:文本比较

提交提交记录返回比赛

题目描述

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

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

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

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

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

输入格式

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

接下来n  行:

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

输出格式

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

样例

样例 #1

样例输入 #1

1
SA

样例输出 #1

51

样例 #2

样例输入 #2

4
DQ
H3
DQ
DT

样例输出 #2

49
数据范围与提示

提示

【样例 1 解释】

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

【样例 2 解释】

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

【样例 3 解释】

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

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

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

【数据范围】

对于所有测试数据,保证:1<=n<=52,输入的  n个字符串每个都代表一张合法的扑克牌,即字符串长度为 2,且第一个字符为  DCHS中的某个字符,第二个字符为  中的某个字符。

测试点编号特殊性质
11A
2~452
5~7B
8~10

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

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

要是有人不会玩扑克,一看上去会懵,其实,这是一道大水题,循环暴力或map即可。

代码:

#include<bits/stdc++.h>
using namespace std;
long long t,i=0;
long long cnt=0;
int main(){
	freopen("poker.in","r",stdin);
	freopen("poker.out","w",stdout);
	char a[60],b[60];
	cin>>t;
	while(t--){
		i++;
		cin>>a[i]>>b[i];
		bool f=1;
		for(int j=1;j<i;j++){
			if(a[j]==a[i]&&b[j]==b[i])f=0;
		}
		if(f==1)cnt++;
	}
	cout<<52-cnt;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值