这道题目是一个经典的贪心算法问题,需要找到一种排序方式,使得获得最多金币的大臣的金币数尽可能少。关键在于如何排序大臣的顺序。 解题思路 1. 贪心策略:为了使最大值最小化,应该按照大臣的左右手乘积进行升序排序。即对于两个大臣i和j,如果i.left * i.right < j.left * j.right,那么i应该排在j前面。 2. 计算金币:排序后,遍历每个大臣,计算前面所有人左手数的乘积除以当前大臣右手数,取整后记录最大值。 代码实现 ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; struct Minister { int left; int right; int product; }; bool compare(const Minister &a, const Minister &b) { return a.product < b.product; } int main() { int n; cin >> n; int kingLeft, kingRight; cin >> kingLeft >> kingRight; vector<Minister> ministers(n); for (int i = 0; i < n; ++i) { cin >> ministers[i].left >> ministers[i].right; ministers[i].product = ministers[i].left * ministers[i].right; } sort(ministers.begin(), ministers.end(), compare); int maxCoin = 0; int product = kingLeft; for (int i = 0; i < n; ++i) { int coin = product / ministers[i].right; if (coin > maxCoin) { maxCoin = coin; } product *= ministers[i].left; } cout << maxCoin << endl; return 0; } ``` 代码解释 1. 结构体定义:`Minister`结构体存储每个大臣的左右手数值及其乘积。 2. 排序函数:`compare`函数按照左右手乘积升序排序。 3. 输入处理:读取国王和大臣的数据,计算每个大臣的乘积。 4. 排序:使用`sort`函数对大臣进行排序。 5. 计算金币:初始化乘积为国王的左手数,遍历每个大臣,计算金币并更新最大值。 6. 输出结果:输出获得最多金币的大臣的金币数。 这种方法确保了大臣的顺序最优,使得最大值最小化。 [2025-05-10 20:59:01 | AI问答 | 507点数解答]