题目链接
英文链接:https://leetcode.com/problems/minimum-cost-to-hire-k-workers/
中文链接:https://leetcode-cn.com/problems/minimum-cost-to-hire-k-workers/
题目详述
有 N 名工人。 第 i 名工人的工作质量为 quality[i] ,其最低期望工资为 wage[i] 。
现在我们想雇佣 K 名工人组成一个工资组。在雇佣 一组 K 名工人时,我们必须按照下述规则向他们支付工资:
- 对工资组中的每名工人,应当按其工作质量与同组其他工人的工作质量的比例来支付工资。
- 工资组中的每名工人至少应当得到他们的最低期望工资。
返回组成一个满足上述条件的工资组至少需要多少钱。
示例 1:
1 | 输入: quality = [10,20,5], wage = [70,50,30], K = 2 |
示例 2:
1 | 输入: quality = [3,1,10,10,1], wage = [4,8,2,2,7], K = 3 |
提示:
- 1 <= K <= N <= 10000,其中 N = quality.length = wage.length
- 1 <= quality[i] <= 10000
- 1 <= wage[i] <= 10000
- 与正确答案误差在 10^-5 之内的答案将被视为正确的。
题目详解
- 由条件 1 可知,K 名工人的工资为
q[i] * x
,x
为公因子。 - 由条件 2 可知,对于任意的这 K 名工人,
q[i] * x >= w[i]
,则x >= w[i] / q[i]
。 - 可以把工人按照
w / q
从小到大进行排序,这样以当前工人的x
为基准,前面的工人必满足要求。 - 问题就转化为了:每次以当前工人的
x
为基准,如何快速在前i
个工人中选择q
最小的 K 个工人。显然,构建一个大根堆可以解决此问题。
1 | public class LeetCode_00857 { |