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

P3632国王游戏(弱化版)c++ 入门 排序 贪心 标准IO 传统题 时间限制 1000ms 内存限制 256MB 通过/尝试次数 382/1181 来源 TomAnderson 题目描述 恰逢 H 国国庆,国王邀请 n n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。 输入格式 第一行包含一个整数 n n,表示大臣的人数。 第二行包含两个整数 a a 和 b b,之间用一个空格隔开,分别表示国王左手和右手上的整数。 接下来 n n 行,每行包含两个整数 a a 和 b b,之间用一个空格隔开,分别表示每个大臣左手和右手

这是一个经典的贪心算法问题,需要找到大臣的排列顺序使得获得最多金币的大臣的金币数尽可能少。关键在于确定排序的规则。 解题思路 1. 排序规则:为了使最大金币数最小,应该按照大臣的左右手乘积升序排列。即对于两个大臣i和j,如果i.left * i.right < j.left * j.right,则i排在j前面。 2. 计算金币:遍历排序后的大臣,维护前面所有大臣左手数值的乘积,计算当前大臣的金币数,并更新最大值。 C++代码实现 ```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 king_left, king_right; cin >> king_left >> king_right; 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 max_coins = 0; int product = king_left; for (int i = 0; i < n; ++i) { int coins = product / ministers[i].right; if (coins > max_coins) { max_coins = coins; } product *= ministers[i].left; } cout << max_coins << endl; return 0; } ``` 代码解释 1. 输入处理:读取大臣人数n,国王的左右手数值,以及每位大臣的左右手数值。 2. 排序准备:计算每位大臣左右手的乘积,存储在`product`字段中。 3. 排序:根据`product`字段对大臣进行升序排序。 4. 计算最大金币数: - 初始化`product`为国王的左手数值。 - 遍历排序后的大臣,计算当前大臣的金币数(前面所有人左手乘积除以当前大臣右手数值)。 - 更新最大金币数`max_coins`。 - 更新`product`为当前大臣左手数值的乘积。 5. 输出结果:打印最大金币数。 这种方法确保在最优的排列顺序下,最大金币数尽可能小。 [2025-04-28 18:16:50 | AI问答 | 550点数解答]

相关提问