事实上这种考虑方式完全可以构成一类题的解题思路,因此我决定做一个小结,不过无法像ouuan奆佬那样写出完整的论文.

重要参考:ouuan奆佬的博客浅谈邻项交换排序的应用以及需要注意的问题

例题1 国王游戏

题目描述

恰逢$H$国国庆,国王邀请$n$位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这$n$位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

输入格式

第一行包含一个整数$n$,表示大臣的人数。

第二行包含两个整数$a$和$b$,之间用一个空格隔开,分别表示国王左手和右手上的整数。

接下来$n$行,每行包含两个整数$a$和$b$,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。

输出格式

一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。

解析

此题是我见过的第一个邻项交换考虑最优性的题目,一句话来讲,对于一个大臣$i$,他的得分$c_i$这样定义:
$$
c_i=\lfloor \frac{\prod_{j=1}^{i}l_j}{r_i}\rfloor
$$
我们要最小化$c$的最大值.这时候我们考虑两个大臣$a,b$,如果$a$排在$b$的前面,就有$ans1=max(\frac{L}{r_a},\frac{L\times l_a}{r_b})$,而如果$b$排在$a$前面,就有$ans2=max(\frac{L}{r_b},\frac{L\times l_b}{r_a})$,其中$L$代表国王左手的数.我们假设不交换更优,即$ans1<ans2$,那就意味着$max(\frac{L}{r_a},\frac{L\times l_a}{r_b})<max(\frac{L}{r_b},\frac{L\times l_b}{r_a})$.为了表示简便,我们令$k1=\frac{L}{r_a},k2=\frac{L\times l_a}{r_b},k3=\frac{L}{r_b},k4=\frac{L\times l_b}{r_a}$,这时候我们发现一定有$k1<k4,k2>k3$,那么要想让$ans1<ans2$成立,则只需要让$k4>k2$,就可以保证$k4$是四个数中最大的了,写出来就是
$$
\frac{L\times l_b}{r_a}>\frac{L\times l_a}{r_b}
$$
整理可得$l_ar_a < l_br_b$.这就是我们排序的条件.

——Gensokyo