题目链接:P1080 [NOIP2012 提高组] 国王游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
只分析贪心的思路
题目描述
恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
输入格式
第一行包含一个整数 n,表示大臣的人数。
第二行包含两个整数 a 和 b,之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
输出格式
一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
贪心思路:
给两个人排序,设第一个人的左手为a1,右手为b1,第二个人的左手为a2,右手为b2;设第一个人前面大臣的左手乘积为S;
假设第一个人排在前面优于第二个人。
Max(S/b1,S*a1/b2)<Max(S/b2,S*a2/b1);
因为a,b,S>0,则 S/b2<=s*a1/b2;
如果S*a1/b2>=S*a2/b1,那么Max(S/b1,S*a1/b2)>=Max(S/b2,S*a2/b1);矛盾。
因此S*a1/b2<S*a2/b1 => a1*b1<a2*b2;
只需将数组a*b从小到大排序即可。