题目背景 所谓同花顺,就是指一些扑克牌,它们花色相同,并且数字连续。 题目描述 现在我手里有n张扑克牌,但它们可能并不能凑成同花顺。我现在想知道,最少更换其中的多少张牌,我能让这 n 张牌都凑成同花顺? 输入输出格式输入格式: 第一行一个整数n,表示扑克牌的张数。接下来n行,每行两个整数 ai 和 bi。其中ai表示第 i 张牌的花色,bi表示第 i 张牌的数字。 输出格式: 一行一个整数,表示最少更换多少张牌可以达到目标。用c语言解这道题。
时间: 2024-02-18 16:03:19 浏览: 106
好的,这是一道关于扑克牌的算法题,我会尽力帮助你解决。
以下是用 C 语言实现的解法:
首先,我们可以用一个数组来记录每种花色出现的牌的个数,然后遍历每种花色,找到其中最长的连续牌的长度,如果这个长度大于等于5(即可以组成同花顺),则不需要更换任何牌,否则需要将这种花色的一些牌更换成能够组成连续牌的牌。更换的牌数等于缺失的牌数。
具体实现如下:
```c
#include <stdio.h>
#define MAX_N 1005
int n;
int cnt[4]; // 记录每种花色出现的牌的个数
int cards[MAX_N][2]; // 记录每张牌的花色和数字
int max(int a, int b) {
return a > b ? a : b;
}
int solve() {
int res = n;
for (int i = 0; i < 4; i++) { // 遍历每种花色
int len = 0, miss = 0;
for (int j = 1; j <= 13; j++) { // 遍历每个数字
if (cards[i * 13 + j][0] == -1) { // 如果这种花色没有出现过这个数字的牌
len = 0; // 当前连续牌的长度清零
miss++; // 缺失牌数加1
} else {
len++; // 当前连续牌的长度加1
res = max(res, miss); // 更新答案
if (len >= 5) break; // 如果可以组成同花顺,直接跳出
}
}
}
return res;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
int a, b;
scanf("%d%d", &a, &b);
cnt[a]++;
cards[(a - 1) * 13 + b][0] = a;
cards[(a - 1) * 13 + b][1] = b;
}
// 将没有出现过的牌标记为-1
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 13; j++) {
if (cards[(i - 1) * 13 + j][0] == 0) {
cards[(i - 1) * 13 + j][0] = -1;
}
}
}
printf("%d\n", solve());
return 0;
}
```
思路是先统计每种花色出现的牌的个数,然后遍历每种花色和每个数字,找到最长的连续牌的长度,并记录缺失牌的个数,最后更新答案即可。
希望对你有帮助!
阅读全文