「EVOI-RD1」小昕昕
题目背景
一副扑克牌共有 54 54 54 张牌,除去大小王后有 52 52 52 张。在同一副牌中,一张牌只可能出现一次。
一副扑克牌中一共有四种花色:黑桃( spade \texttt{spade} spade)、红桃( heart \texttt{heart} heart)、梅花( club \texttt{club} club)、方块( diamond \texttt{diamond} diamond)。每个花色的牌共有 13 13 13 张,分别为 A ∼ K \texttt{A} \sim \texttt{K} A∼K。
在题目中,以上四种花色分别以 S,H,C,D \texttt{S,H,C,D} S,H,C,D 表示。
我们约定,任何一张牌,都以 花色+点数 表示,并且约定用 T \texttt{T} T 表示 10 \texttt{10} 10,如 SA,D5,HT,CQ \texttt{SA,D5,HT,CQ} SA,D5,HT,CQ。
题目描述
昕昕手上有 两副无大小王 的扑克牌,她会从这些扑克牌里取出 n n n 张牌。
昕昕创造了一个组合为 “小昕昕”,它的定义是,任意取出 3 3 3 张牌,若这 3 3 3 张牌的 牌点一样 ,且花色有且仅有 两种 ,则称为一对“小昕昕”。如 H3,S3,S3 \texttt{H3,S3,S3} H3,S3,S3 是一对“小昕昕”。
当这三张扑克牌组成 “小昕昕” 后,昕昕就会把它们从牌堆内拿出,不可再次使用。
现在,昕昕想让你帮她数数,这副牌里最多能组成多少对 “小昕昕”。
输入格式
第一行为一个正整数 n n n。
第二至 n + 1 n+1 n+1 行,每行为一张扑克牌。
输出格式
输出这 n n n 张牌内,最多能组成多少对“小昕昕”。
样例 #1
样例输入 #1
3
S3
H3
S3
样例输出 #1
1
样例 #2
样例输入 #2
7
ST
ST
HT
HT
CT
CT
DT
样例输出 #2
2
样例 #3
样例输入 #3
6
DA
HA
D4
C5
DA
D4
样例输出 #3
1
提示
本题采用捆绑测试。
- Subtask 1 (10 pts) \texttt{Subtask 1 (10 pts)} Subtask 1 (10 pts) : 1 ≤ n ≤ 3 1 \le n \le 3 1≤n≤3。
- Subtask 2 (20 pts) \texttt{Subtask 2 (20 pts)} Subtask 2 (20 pts) : 1 ≤ n ≤ 5 1 \le n \le 5 1≤n≤5。
- Subtask 3 (30 pts) \texttt{Subtask 3 (30 pts)} Subtask 3 (30 pts) : 1 ≤ n ≤ 20 1 \le n \le 20 1≤n≤20。
- Subtask 4 (10 pts) \texttt{Subtask 4 (10 pts)} Subtask 4 (10 pts) : 1 ≤ n ≤ 70 1 \le n \le 70 1≤n≤70。
- Subtask 5 (30 pts) \texttt{Subtask 5 (30 pts)} Subtask 5 (30 pts) :无特殊限制。
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 104 1 \le n \le 104 1≤n≤104,保证输入的牌都存在于两副无大小王的扑克牌中。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string a;
int pk[5][14];
void add(string a) {int h, l;if (a[0] == 'S') {h = 1;}if (a[0] == 'H') {h = 2;}if (a[0] == 'C') {h = 3;}if (a[0] == 'D') {h = 4;}if (a[1] == 'A') {l = 1;}if (a[1] == 'T') {l = 10;}if (a[1] == 'J') {l = 11;}if (a[1] == 'Q') {l = 12;}if (a[1] == 'K') {l = 13;} if(a[1]>='2'&&a[1]<='9') {l = a[1] - '0';}pk[h][l]++;return;
}
ll n, ans;
int main() {int n;int ans=0;int cnt1, cnt2;cin >> n;for (int i = 1; i <= n; i++) {cin >> a;add(a);}for (int i = 1; i <= 13; i++) {cnt1 = 0;cnt2 = 0;for (int j = 1; j <= 4; j++) {if (pk[j][i] == 2) cnt1++;
// cout<<cnt1<<endl;if(pk[j][i]==1) cnt2++;
// cout<<cnt2<<endl;}while(cnt1>cnt2){cnt1--;cnt2+=2;}ans+=cnt1;}cout<<ans;return 0;
}