酷代码 AI
菜单

用C++牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的 A A 到 K K 加上大小王的共 54 54 张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下: 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K < A < 2 < 小王 < 大王 3<4<5<6<7<8<9<10<J<Q<K<A<2<小王<大王,而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由 n n 张牌组成。游戏者每次可以根据规定的牌型进行出牌,首先打光自己的手牌一方取得游戏的胜利。 现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可以将它们打光。请你帮他解决这个问题。 需要注意的是,本题中游戏者每次可以出手的牌型与一般的斗地主相似而略有不同。具体规则如下: 本题数据随机,不支持hack,要hack或强力数据请点击这里。 输入格式 第一行包含用空格隔开的 2 2 个正整数 T , n T,n,表示手牌的组数以及每组手牌的张数。 接下来 T T 组数据,每组数据 n n 行,每行一个非负

以下是一个用 C++ 实现的解决方案,用于计算每组手牌最少需要多少次出牌可以打光。 ```cpp #include <iostream> #include <vector> #include <algorithm> // 定义牌的结构体 struct Card { int num; // 牌的数码 int suit; // 牌的花色 Card(int n, int s) : num(n), suit(s) {} }; // 比较函数,用于对牌进行排序 bool compareCards(const Card& a, const Card& b) { if (a.num != b.num) { if (a.num == 0) return false; // 大小王放最后 if (b.num == 0) return true; if (a.num == 2) return false; // 2 放较后 if (b.num == 2) return true; if (a.num == 1) return false; // A 放较后 if (b.num == 1) return true; return a.num < b.num; } return a.suit < b.suit; } // 计算最少出牌次数 int minMovesToClear(std::vector<Card>& hand) { std::sort(hand.begin(), hand.end(), compareCards); int moves = 0; int i = 0; while (i < hand.size()) { // 处理大小王 if (hand[i].num == 0) { if (i + 1 < hand.size() && hand[i + 1].num == 0) { i += 2; // 大小王一起出 } else { i++; // 单出小王或大王 } moves++; continue; } // 寻找连续相同数码的牌 int j = i; while (j < hand.size() && hand[j].num == hand[i].num) { j++; } moves++; // 出这组相同数码的牌 i = j; } return moves; } int main() { int T, n; std::cin >> T >> n; for (int t = 0; t < T; t++) { std::vector<Card> hand; for (int i = 0; i < n; i++) { int a, b; std::cin >> a >> b; hand.emplace_back(a, b); } int result = minMovesToClear(hand); std::cout << result << std::endl; } return 0; } ``` 代码说明: 1. 结构体 `Card`:用于存储每张牌的数码和花色。 2. 比较函数 `compareCards`:对牌进行排序,大小王放2 和 A 也相对靠后,其余按数码从小到大排序。 3. 函数 `minMovesToClear`: - 首先对牌进行排序。 - 遍历手牌,处理大小王的情况,如果有大小王可以一起出,否则单出。 - 对于其他牌,寻找连续相同数码的牌,将其作为一组出牌。 4. 主函数 `main`: - 读取输入的手牌组数 `T` 和每组手牌的张数 `n`。 - 对于每组手牌,读取每张牌的信息并存储在 `hand` 向量中。 - 调用 `minMovesToClear` 函数计算最少出牌次数并输出结果。 复杂度分析: - 时间复杂度:排序的时间复杂度为 $O(n log n)$,遍历手牌的时间复杂度为 $O(n)$,因此总的时间复杂度为 $O(n log n)$。 - 空间复杂度:主要用于存储手牌,空间复杂度为 $O(n)$。 [2026-01-24 22:37:01 | AI问答 | 894点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多