酷代码 AI
菜单
全部AI  /  热门  /  AI问答
服务商

题目描述 dXqwq 正在参加一场德州扑克比赛!现在,比赛已经进入了最终阶段: 𝑛 n 位选手都已经押上了全部的筹码,展示手牌开始比较大小。 但选手只要摊牌就可以,可是作为荷官的 orangejuice 要考虑的事情就很多了。她需要你的帮助来计算每位选手的筹码分配,你能帮帮她吗? 给定每位选手的筹码量 𝑎 𝑖 a i ​ 和牌力相对大小 𝑏 𝑖 b i ​ ,你需要求出每位选手在这手牌结束之后的筹码量 𝑐 𝑖 c i ​ 。 无论你是否玩过德州扑克,请仔细阅读本题中筹码分配的定义: 统计场上所有筹码量非零的选手的筹码最小值 𝑑 d。 将上述所有人每人扣除 𝑑 d 的筹码,建立一个边池。 重复这两个操作,直到只有 ≤ 1 ≤1 个人的筹码量非零。 对于每个边池,找出所有向该池提供筹码的人中,牌力(并列)最大的。 这些人将会均分这个边池的所有筹码,我们认为筹码可以无限细分。 输入格式 第一行输入一个整数 𝑛 n。 第二行输入 𝑛 n 个整数 𝑎 𝑖 a i ​ 。 第三行输入 𝑛 n 个整数 𝑏 𝑖 b

```cpp #include <iostream> #include <vector> #include <algorithm> #include <climits> using namespace std; // 定义选手结构体,包含筹码量、牌力和最终筹码量 struct Player { int chips; int strength; double finalChips; }; int main() { int n; cin >> n; vector<Player> players(n); // 读取每位选手的初始筹码量 for (int i = 0; i < n; ++i) { cin >> players[i].chips; players[i].finalChips = 0; } // 读取每位选手的牌力 for (int i = 0; i < n; ++i) { cin >> players[i].strength; } while (true) { int nonZeroCount = 0; int minChips = INT_MAX; // 统计非零筹码选手数量和最小筹码量 for (const auto& player : players) { if (player.chips > 0) { ++nonZeroCount; minChips = min(minChips, player.chips); } } // 如果非零筹码选手数量小于等于1,结束循环 if (nonZeroCount <= 1) { break; } int sidePot = 0; vector<int> contributors; // 建立边池,扣除每位选手的最小筹码量 for (int i = 0; i < n; ++i) { if (players[i].chips > 0) { sidePot += minChips; players[i].chips -= minChips; contributors.push_back(i); } } int maxStrength = INT_MIN; vector<int> winners; // 找出向边池提供筹码的选手中牌力最大的 for (int index : contributors) { if (players[index].strength > maxStrength) { maxStrength = players[index].strength; winners.clear(); winners.push_back(index); } else if (players[index].strength == maxStrength) { winners.push_back(index); } } // 均分边池的筹码 double share = static_cast<double>(sidePot) / winners.size(); for (int index : winners) { players[index].finalChips += share; } } // 处理最后可能剩余筹码的选手 for (int i = 0; i < n; ++i) { players[i].finalChips += players[i].chips; } // 输出每位选手的最终筹码量 for (const auto& player : players) { cout.precision(12); cout << player.finalChips << endl; } return 0; } ``` 代码解释: 1. 结构体 `Player`:用于存储每位选手的筹码量、牌力和最终筹码量。 2. 输入处理:读取选手数量、每位选手的初始筹码量和牌力。 3. 边池构建循环:在循环中,统计非零筹码选手数量和最小筹码量。如果非零筹码选手数量小于等于1,结束循环。否则,建立边池,扣除每位选手的最小筹码量,并找出向边池提供筹码的选手中牌力最大的,将边池筹码均分给这些选手。 4. 最终处理:处理最后可能剩余筹码的选手,并将其加到最终筹码量中。 5. 输出结果:输出每位选手的最终筹码量。 复杂度分析: - 时间复杂度:$O(n^2)$,其中 $n$ 是选手的数量。在最坏情况下,每次循环都需要遍历所有选手。 - 空间复杂度:$O(n)$,主要用于存储选手信息和边池相关信息。 [2025-06-02 15:24:00 | AI问答 | 907点数解答]

相关提问