若有 N 个工人,则第 i 个工人具有“质量[ i ]”和“最低期望工资[ i ]”两个指标。现在要雇用 K 个工人来组成一个“有薪小组”,必须根据以下规则向他们付款。
1)对于该组的每个工人,都应按其质量(quality)的比例支付工资。
2)该组中的每个工人都必须至少获得其最低期望工资(wage)。
返回满足上述条件所需的最小金额。
例1
输入:质量=[10,20,5],工资=[70,50,30], K =2
输出:105.00000
例2
输入:质量=[3,1,10,10,1],工资=[4,8,2,2,7], K =3
输出:30.66667
思路:计算每个工人的工资/质量并进行排序,因为所有工人都必须按照一个比例来付钱,所以每次要把质量最高的元素弹出数组,把剩余的质量加在一起,同时乘以其中最高的工资/质量值,就是付给工人的最低工资。
对于例1,首先计算工资/质量,我们得到数组[(7.0,10),(2.5,20),(6,5)],按照工资/质量从小到大排序,我们得到排序后的数组[(2.5,20),(6,5),(7,10)]。
对于第一个元素(2.5,20),质量=20;同时把20压入优先队列,因为我们需要2个工人,暂时不需要计算成本。
对于第二个元素(6,5),质量=25,同时把5压入优先队列,因为这个时候已经有2个工人了,需要计算一下成本,即res=6×25=150。
对于第三个元素(7,10),质量和为qSum=35,把-10压入堆栈,因为此时优先队列的长度大于2,所以要把最小的工资/质量对应的元素弹出数组,也就是把20弹出来。因此qSum=15,此时最高的工资/质量值为ratio=7,得最低成本为res=105,所以最低成本就是105。
代码清单5-4 雇用 K 个工人的最低成本