描述
恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这n位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
思路
学姐说过,求最大值的最小值问题无非两种手法:贪心和二分。
这道题要求安排排队的顺序而不是求出最大值的最小值,所以二分并不是很好入手。
先说一下本题正解的贪心策略:左手与右手的数的乘积小的排在前面。
证明:
设紧挨着的两个人a,b的左右手数字分别为La,Lb,Ra,Rb,设a和b前面的所有人的左手的数字的乘积为S,可以发现,交换ab的顺序不会影响ab前面所有人得到的金币数,也不会影响ab后面所有人得到的金币数目,那么可以假设让a排在b前面比让b排在a前面的结果更优:
a在b前时:
a获得的金币数为:S/Ra ———– #1
b获得的金币数为:S*La/Rb ———–#2
b在a前时:
a获得的金币数为:S*Lb/Ra ———–#3
b获得的金币数为:S/Rb ————#4
那么要想让假设成立,就必须有:max(#1 , #2) < max(#3 , #4)———#5
很明显可以看出,#1 < #3 ,# < #4
如果要#5成立,还必须有#3 > #2 ,即 S*Lb/Ra > S*La/Rb
化简得到:Lb*Rb > La*Ra
所以得到左右手数字乘积小的排在前面会使得结果更优。
说明:以上仅为本题的大致思路,具体解决还需涉及高精度,在此不再赘述。