每天一个TopCoder算法题(16.08.08)

这个题目来自TopCoder SRM536 250分的题目

原题

每天一个TopCoder算法题(16.08.08)_第1张图片
srm536_250.png

题意

有一些公司,每个公司都有一个权值,多个公司可以合并成一个公司,合并后的权值为(r0 + r1 + r2 .. + rn) / n。例如,一个3, 4, 5 的公司合并后的结果是4, 一个-2, -7的公司合并的结果是-4.5。现在问题是问这些公司经过多次合并,最后的公司的权值最大是多少,例如3,4,5可以先3,4合并,变成3.5再3.5跟5合并,变成4.25.

思考

这个题目,我们很容易就能想到,最大的公司一定要最后合并,然后是次大的公司,然后。。于是我们需要从小到大排序。然后我们来看看2合并做两次合并大还是3个一块合并大。我们假设a

公式.png

所以这个题目的解法就是将权值从小到大排序,然后开始合并。(1,2)合并结果跟3,((1,2),3)合并结果再跟4。。
我的天,我们竟然靠蒙的方法把这个题目给蒙对了。。。
当然,我们最科学的解法并不是这样的。
我们假设公司A是由a0,a1..ap合并而成,A的价值为x, 公司B是由b0,b1,bq合并而成,价值为y。假设a0是里面最大的一个公司,那么,如果A剔除a0,最后再和a0进行合并,如果结果更大,那么满足如下公式:

x + y <= a0 + (px + qy - a0) / (p + q - 1) 

等价于

(x + y) ((p + q - 1) / (p + q - 1)) <= (px + qy) / (p + q - 1) + a0((p + q - 2) / (p + q - 1)) 

化简可得

x(q - 1) + y(p - 1) <= a0(p - 1) + a0(q - 1)

因为a0 > x 且 a0 > y,所以条件成立。

你可能感兴趣的:(每天一个TopCoder算法题(16.08.08))