```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点数解答]