根据题意我们可以知道,大臣 111 和大臣 222 位置能交换的必要条件是:大臣 222 放在大臣 111 的前面得到的最大值更加小。那么我们分别讨论两种情况下的最大值,假设只有两个大臣:
如果大臣 111 放在前面,他俩获得的金币数分别为:
a0a0a0 / b1b1b1 , a0a0a0 * a1a1a1 / b2b2b2
如果大臣 222 放在前面,他俩获得的金币数分别为:
a0a0a0 / b2b2b2 , a0a0a0 * a2a2a2 / b1b1b1
首先,我们约去式子里面的 a0a0a0 ,然后分别讨论两种情况的最大值,就变成了比较:
maxmaxmax ( 111 / b1b1b1 , a1a1a1 / b2b2b2 )和 maxmaxmax ( 111 / b2b2b2 , a2a2a2 / b1b1b1 )的大小
根据 0<a0<a0<a , aaa 是整数的条件,我们可以得出:
a1a1a1 / b2b2b2 >=>=>= 111 / b2b2b2 、 111 / b1b1b1 <=<=<= a2a2a2 / b1b1b1
那么,如果 111 / b1b1b1 是最大的,则有
111 / b1>=a2b1>=a2b1>=a2 / b1b1b1 ,只可能左右两边相等,则有 111 / b2<=a2b2<=a2b2<=a2 / b1b1b1 ,所以两种情况的最大值是一样的,则不用交换。
同理可得 111 / b2b2b2 是最大的情况也不用交换。
那么我们就只要 a1a1a1 / b2b2b2 和 a2a2a2 / b1b1b1 的大小就可以了,也就是说如果 a1a1a1 / b2>a2b2>a2b2>a2 / b1b1b1 ,那么就要交换,变形得:
a1a1a1 * b1b1b1 >>> a2a2a2 * b2b2b2
表示要交换,我们排序就只要按照 aaa * bbb 的从小到大排就可以了。
下面是用字符数组写的高乘以及高精除低精。