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

B. 德州扑克 时间限制: 2000ms 空间限制: 524288KB 题目描述 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 a i ​ 。 第三

```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; // 比较函数,用于按照筹码量从小到大排序 bool compare(const pair<int, int>& a, const pair<int, int>& b) { return a.first < b.first; } // 计算每位选手最终筹码量的函数 vector<double> calculateChips(vector<int>& chips, vector<int>& powers) { vector<pair<int, int>> players; for (int i = 0; i < chips.size(); ++i) { players.push_back({chips[i], powers[i]}); } sort(players.begin(), players.end(), compare); vector<double> result(chips.size(), 0); while (players.size() > 1) { int minChip = players[0].first; vector<pair<int, int>> sidePoolPlayers; // 将筹码最小值的玩家的筹码扣除,建立边池 for (int i = 0; i < players.size(); ++i) { if (players[i].first!= 0) { players[i].first -= minChip; if (players[i].first!= 0) { sidePoolPlayers.push_back(players[i]); } } } // 找出边池中的最大牌力 int maxPower = 0; for (const auto& player : sidePoolPlayers) { maxPower = max(maxPower, player.second); } // 牌力最大的玩家平分边池筹码 double sidePoolChips = minChip * sidePoolPlayers.size(); double eachShare = sidePoolChips / count_if(sidePoolPlayers.begin(), sidePoolPlayers.end(), [maxPower](const pair<int, int>& p) { return p.second == maxPower; }); for (auto& player : sidePoolPlayers) { if (player.second == maxPower) { result[player.second - 1] += eachShare; } } // 移除筹码为 0 的玩家 players.erase(remove_if(players.begin(), players.end(), [](const pair<int, int>& p) { return p.first == 0; }), players.end()); } // 最后剩下的玩家拥有全部剩余筹码 if (!players.empty()) { result[players[0].second - 1] += players[0].first; } return result; } int main() { int n; cin >> n; vector<int> chips(n); vector<int> powers(n); for (int i = 0; i < n; ++i) { cin >> chips[i]; } for (int i = 0; i < n; ++i) { cin >> powers[i]; } vector<double> finalChips = calculateChips(chips, powers); for (const auto& chip : finalChips) { cout << chip << endl; } return 0; } ``` [2025-05-25 10:06:07 | AI问答 | 702点数解答]

相关提问