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

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

```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; bool cmp(pair<int, int> a, pair<int, int> b) { if (a.second!= b.second) { return a.second > b.second; } return a.first < b.first; } int main() { int n; cin >> n; vector<int> a(n), b(n); for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < n; i++) { cin >> b[i]; } vector<pair<int, int>> players; for (int i = 0; i < n; i++) { players.push_back({a[i], b[i]}); } while (true) { sort(players.begin(), players.end(), cmp); int minChip = players.back().first; vector<pair<int, int>> newPlayers; double sidePool = 0; for (int i = players.size() - 1; i >= 0 && players[i].first == minChip; i--) { sidePool += minChip; players[i].first -= minChip; } if (sidePool > 0) { vector<pair<int, int>> winners; for (int i = players.size() - 1; i >= 0 && players[i].first > 0; i--) { if (players[i].second == players.back().second) { winners.push_back(players[i]); } } double eachWin = sidePool / winners.size(); for (auto& winner : winners) { winner.first += eachWin; } } int countNonZero = 0; for (const auto& player : players) { if (player.first > 0) { newPlayers.push_back(player); countNonZero++; } } players = newPlayers; if (countNonZero <= 1) { break; } } for (const auto& player : players) { cout << player.first << endl; } return 0; } ``` [2025-05-25 11:21:08 | AI问答 | 537点数解答]

相关提问