德州扑克比赛筹码分配难题:代码实现与复杂度剖析
```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)$,主要用于存储选手信息和边池相关信息。 ######[AI问答 | 907点数解答 | 2025-06-02 15:24:00]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)365
- C++求解序列或与运算和差值:避O(nq)复杂度及数据处理要点(字节豆包 | 534点数解答 | 2025-10-17 20:05:07)70
- C++ 初学者搞定小鱼“比可爱”计数难题:代码详解与复杂度分析(字节豆包 | 553点数解答 | 2026-02-07 18:59:03)56
- C++实现:帮小鱼计算左边不如自己可爱的同伴数量(字节豆包 | 337点数解答 | 2026-02-07 21:06:12)57
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)336
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)490
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)376
- iOS开发:手把手教你完整实现代理模式,含声明与实现步骤!(阿里通义 | 268点数解答 | 2023-11-08 00:39:55)269
- JavaScript 开发:用 Animation 实现自定义动画的简易教程 (阿里通义 | 333点数解答 | 2023-11-09 01:50:07)260
- Vue.js 与 Matter.js 碰撞:轻松实现物理模拟全攻略 (讯飞星火 | 522点数解答 | 2024-05-29 22:26:06)447
- JS实现移动端网页快捷键创建方式及注意事项(阿里通义 | 284点数解答 | 2024-06-05 19:02:59)281
- 车载系统 UML 类图设计:涵盖 Car、Engine、娱乐系统等的完整类定义与关系解析 (字节豆包 | 760点数解答 | 2024-08-15 22:51:04)324