```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; // 定义选手结构体 struct Player { double chips; // 选手的筹码量 int strength; // 选手的牌力相对大小 double finalChips; // 选手最终的筹码量 }; // 找出当前筹码量非零的选手中的最小筹码量 double findMinChips(const vector<Player>& players) { double minChips = 1e9; for (const auto& player : players) { if (player.chips > 0) { minChips = min(minChips, player.chips); } } return minChips; } // 找出向边池提供筹码的选手中牌力最大的选手 vector<int> findMaxStrengthPlayers(const vector<Player>& players, double sidePotContribution) { int maxStrength = -1; vector<int> maxStrengthPlayers; for (size_t i = 0; i < players.size(); ++i) { if (players[i].chips >= sidePotContribution) { if (players[i].strength > maxStrength) { maxStrength = players[i].strength; maxStrengthPlayers.clear(); maxStrengthPlayers.push_back(i); } else if (players[i].strength == maxStrength) { maxStrengthPlayers.push_back(i); } } } return maxStrengthPlayers; } // 计算每位选手最终的筹码量 vector<double> calculateFinalChips(int n, vector<double> a, vector<int> b) { vector<Player> players(n); for (int i = 0; i < n; ++i) { players[i].chips = a[i]; players[i].strength = b[i]; players[i].finalChips = 0; } while (true) { double minChips = findMinChips(players); if (minChips == 1e9) { break; } double sidePot = 0; for (auto& player : players) { if (player.chips > 0) { sidePot += min(player.chips, minChips); player.chips -= min(player.chips, minChips); } } vector<int> maxStrengthPlayers = findMaxStrengthPlayers(players, minChips); double share = sidePot / maxStrengthPlayers.size(); for (int playerIndex : maxStrengthPlayers) { players[playerIndex].finalChips += share; } } vector<double> result(n); for (int i = 0; i < n; ++i) { result[i] = players[i].finalChips; } return result; } int main() { int n; cin >> n; vector<double> a(n); vector<int> b(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } for (int i = 0; i < n; ++i) { cin >> b[i]; } vector<double> finalChips = calculateFinalChips(n, a, b); for (double chips : finalChips) { cout << chips << " "; } cout << endl; return 0; } ``` 代码解释: 1. 结构体 `Player`:用来存储每位选手的信息,包括当前筹码量 `chips`、牌力相对大小 `strength` 和最终筹码量 `finalChips`。 2. 函数 `findMinChips`:遍历所有选手,找出当前筹码量非零的选手中的最小筹码量。 3. 函数 `findMaxStrengthPlayers`:找出向边池提供筹码的选手中牌力最大的选手,返回这些选手的索引。 4. 函数 `calculateFinalChips`: - 初始化选手信息。 - 不断找出最小筹码量,建立边池,扣除选手筹码。 - 找出向边池提供筹码的选手中牌力最大的选手,将边池筹码均分给他们。 - 重复上述步骤,直到没有非零筹码的选手。 5. 主函数 `main`: - 读取选手数量、每位选手的筹码量和牌力相对大小。 - 调用 `calculateFinalChips` 函数计算最终筹码量。 - 输出每位选手的最终筹码量。 复杂度分析: - 时间复杂度:$O(n^2)$,其中 $n$ 是选手的数量。每次建立边池和分配筹码都需要遍历所有选手。 - 空间复杂度:$O(n)$,主要用于存储选手信息。 [2025-06-02 15:23:17 | AI问答 | 1127点数解答]