购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.2 实例1
雇用 K 个工人的最低成本

若有 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 个工人的最低成本 Owj37k8e6o1cUU5UxhEWwZNp/vwI2+d20XA5E1p0XqGqO4ZV9gvVlhD42HEKUnx4

点击中间区域
呼出菜单
上一章
目录
下一章
×