P7866 「EVOI-RD1」小昕昕 题解
已注销yj!gBUM · · 题解
题目不难,直接模拟即可。
因为题目只有 2 副扑克牌,所以每种牌最多只有 2 张。
所以当比如点数 J 这种类型的牌有 6 张或以上时,肯定能组成 2 对小昕昕;
而当只有 3 张或者以上时就需要分类讨论了:如果有某种花色的 J 有2张,则肯定能组成 1 对小昕昕,否则无法组成 1 组小昕昕。
代码见下:
// Problem: P7866 「EVOI-RD1」小昕昕
// From: Luogu
// Url: https://www.luogu.com.cn/problem/P7866?contestId=49613
// Interactive:false
// MemoryLimit: 128 MB
// TimeLimit: 1000 ms
//
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
int s[6][16] = {0};//用来统计每张牌的个数
int num, ans = 0;
void input() {//将每张牌统计计入数组
for (int i = 1; i <= num; i++) {
string sum;
cin >> sum;
if ((sum[0] == 'S' && sum[1] == 'A') || (sum[0] == 'S' && sum[1] == '1'))
s[1][1]++; //黑桃1
if (sum[0] == 'S' && sum[1] == '2') s[1][2]++; //黑桃2
if (sum[0] == 'S' && sum[1] == '3') s[1][3]++; //黑桃3
if (sum[0] == 'S' && sum[1] == '4') s[1][4]++; //黑桃4
if (sum[0] == 'S' && sum[1] == '5') s[1][5]++; //黑桃5
if (sum[0] == 'S' && sum[1] == '6') s[1][6]++; //黑桃6
if (sum[0] == 'S' && sum[1] == '7') s[1][7]++; //黑桃7
if (sum[0] == 'S' && sum[1] == '8') s[1][8]++; //黑桃8
if (sum[0] == 'S' && sum[1] == '9') s[1][9]++; //黑桃9
if (sum[0] == 'S' && sum[1] == 'T') s[1][10]++; //黑桃10
if (sum[0] == 'S' && sum[1] == 'J') s[1][11]++; //黑桃J
if (sum[0] == 'S' && sum[1] == 'Q') s[1][12]++; //黑桃Q
if (sum[0] == 'S' && sum[1] == 'K') s[1][13]++; //黑桃K
if ((sum[0] == 'H' && sum[1] == 'A') || (sum[0] == 'H' && sum[1] == '1'))
s[2][1]++; //红桃1
if (sum[0] == 'H' && sum[1] == '2') s[2][2]++; //红桃2
if (sum[0] == 'H' && sum[1] == '3') s[2][3]++; //红桃3
if (sum[0] == 'H' && sum[1] == '4') s[2][4]++; //红桃4
if (sum[0] == 'H' && sum[1] == '5') s[2][5]++; //红桃5
if (sum[0] == 'H' && sum[1] == '6') s[2][6]++; //红桃6
if (sum[0] == 'H' && sum[1] == '7') s[2][7]++; //红桃7
if (sum[0] == 'H' && sum[1] == '8') s[2][8]++; //红桃8
if (sum[0] == 'H' && sum[1] == '9') s[2][9]++; //红桃9
if (sum[0] == 'H' && sum[1] == 'T') s[2][10]++; //红桃10
if (sum[0] == 'H' && sum[1] == 'J') s[2][11]++; //红桃J
if (sum[0] == 'H' && sum[1] == 'Q') s[2][12]++; //红桃Q
if (sum[0] == 'H' && sum[1] == 'K') s[2][13]++; //红桃K
if ((sum[0] == 'C' && sum[1] == 'A') || (sum[0] == 'C' && sum[1] == '1'))
s[3][1]++; //梅花1
if (sum[0] == 'C' && sum[1] == '2') s[3][2]++; //梅花2
if (sum[0] == 'C' && sum[1] == '3') s[3][3]++; //梅花3
if (sum[0] == 'C' && sum[1] == '4') s[3][4]++; //梅花4
if (sum[0] == 'C' && sum[1] == '5') s[3][5]++; //梅花5
if (sum[0] == 'C' && sum[1] == '6') s[3][6]++; //梅花6
if (sum[0] == 'C' && sum[1] == '7') s[3][7]++; //梅花7
if (sum[0] == 'C' && sum[1] == '8') s[3][8]++; //梅花8
if (sum[0] == 'C' && sum[1] == '9') s[3][9]++; //梅花9
if (sum[0] == 'C' && sum[1] == 'T') s[3][10]++; //梅花10
if (sum[0] == 'C' && sum[1] == 'J') s[3][11]++; //梅花J
if (sum[0] == 'C' && sum[1] == 'Q') s[3][12]++; //梅花Q
if (sum[0] == 'C' && sum[1] == 'K') s[3][13]++; //梅花K
if ((sum[0] == 'D' && sum[1] == 'A') || (sum[0] == 'D' && sum[1] == '1'))
s[4][1]++; //方块1
if (sum[0] == 'D' && sum[1] == '2') s[4][2]++; //方块2
if (sum[0] == 'D' && sum[1] == '3') s[4][3]++; //方块3
if (sum[0] == 'D' && sum[1] == '4') s[4][4]++; //方块4
if (sum[0] == 'D' && sum[1] == '5') s[4][5]++; //方块5
if (sum[0] == 'D' && sum[1] == '6') s[4][6]++; //方块6
if (sum[0] == 'D' && sum[1] == '7') s[4][7]++; //方块7
if (sum[0] == 'D' && sum[1] == '8') s[4][8]++; //方块8
if (sum[0] == 'D' && sum[1] == '9') s[4][9]++; //方块9
if (sum[0] == 'D' && sum[1] == 'T') s[4][10]++; //方块10
if (sum[0] == 'D' && sum[1] == 'J') s[4][11]++; //方块J
if (sum[0] == 'D' && sum[1] == 'Q') s[4][12]++; //方块Q
if (sum[0] == 'D' && sum[1] == 'K') s[4][13]++; //方块K
}
}
/*
void test() {
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 13; j++) {
cout << s[i][j] << " ";
}
cout << "\n";
}
}
*/
void solve() {
for (int i = 1; i <= 13; i++) {
if (s[1][i] + s[2][i] + s[3][i] + s[4][i] >= 6)//该点数的牌不少于6张时肯定能组成 2 对小昕昕
ans += 2;
else {
if (s[1][i] >= 2 && s[2][i] >= 1) {
s[1][i] -= 2;
s[2][i] -= 1;
ans++;
}
if (s[1][i] >= 2 && s[3][i] >= 1) {
s[1][i] -= 2;
s[3][i] -= 1;
ans++;
}
if (s[1][i] >= 2 && s[4][i] >= 1) {
s[1][i] -= 2;
s[4][i] -= 1;
ans++;
}
if (s[2][i] >= 2 && s[3][i] >= 1) {
s[2][i] -= 2;
s[3][i] -= 1;
ans++;
}
if (s[2][i] >= 2 && s[4][i] >= 1) {
s[2][i] -= 2;
s[4][i] -= 1;
ans++;
}
if (s[3][i] >= 2 && s[4][i] >= 1) {
s[3][i] -= 2;
s[4][i] -= 1;
ans++;
}
if (s[1][i] >= 1 && s[2][i] >= 2) {
s[1][i] -= 1;
s[2][i] -= 2;
ans++;
}
if (s[1][i] >= 1 && s[3][i] >= 2) {
s[1][i] -= 1;
s[3][i] -= 2;
ans++;
}
if (s[1][i] >= 1 && s[4][i] >= 2) {
s[1][i] -= 1;
s[4][i] -= 2;
ans++;
}
if (s[2][i] >= 1 && s[3][i] >= 2) {
s[2][i] -= 1;
s[3][i] -= 2;
ans++;
}
if (s[2][i] >= 1 && s[4][i] >= 2) {
s[2][i] -= 1;
s[4][i] -= 2;
ans++;
}
if (s[3][i] == 1 && s[4][i] == 2) {
s[3][i] -= 1;
s[4][i] -= 2;
ans++;
}
}
}
}
int main() {
ios::sync_with_stdio(false);//关闭同步流
cin >> num;
input();
solve();
cout << ans << "\n";
return 0;
}