Google面试题专题10 - leetcode857. Minimum Cost to Hire K Workers

根据工人的工作质量和期望工资,求解雇佣K名工人并满足支付规则的最小成本。通过计算ratio(wage/quality),对ratio排序,使用最小堆选取质量最低的K个,以达到最小成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

857. Minimum Cost to Hire K Workers - Hard

题目描述

有 N 名工人。第 i 名工人的工作质量为 quality[i],期望的最低工资为 wage[i]。
现在我们想雇佣 K 名工人组成一个工资组,且必须按照以下规则向他们支付工资:
1)对工资组中的每名工人,应当按其工作质量与同组其他工人的工作质量的比值来支付工资;
2)工资组中的每名工人至少应当得到他们的最低期望工资。
返回组成一个满足上述条件的工资组所需的最少金额。

例子
Example 1:

Input: quality = [10,20,5], wage = [70,50,30], K = 2
Output: 105.00000

Explanation: We pay 70 to 0-th worker and 35 to 2-th worker.

Example 2:

Input: quality = [3,1,10,10,1], wage = [4,8,2,2,7], K = 3
Output: 30.66667

Explanation: We pay 4 to 0-th worker, 13.33333 to 2-th and 3-th workers seperately.

思想
规则1:应当按其工作质量与同组其他工人的工作质量的比值来支付工资;

表明:工资组内的每名工人最终应具有相同的ratio = wage[i]/quality[i]

1)记工人i 的ratio[i] = wage[i]/quality[i],并按ratio升序排列
2)若选择ratio[i]作为base-ratio,则只有工人j(j<=i)满足规则2(即:支付给工人j的工资为ratio[i] * quality[j],要 满足>wage[j])
ratio[j]<=ratio[i] ==>wage[j] = ratio[j] * quality[j] <= ratio[i] * quality[j]
3)遍历所有可能的ratio[i],并在[0,i]中选择wage最少的K名工人

所需的总工资 = base-ratio * 总质量;
用堆来维护K个工人的quality。因为ratio固定,所以quality越低则所需wage越少。

解法
复杂度:时间O(nlogn),空间O(n)。

import heapq
class Solution(object):
    def mincostToHireWorkers(self, quality, wage, K):
        """
        :type quality: List[int]
        :type wage: List[int]
        :type K: int
        :rtype: float
        """
        workers = sorted([(float(w)/q, q) for w, q in zip(wage, quality)])
        res = float('inf')
        qSum = 0
        heap = []
        for r, q in workers:
            heapq.heappush(heap, -q)
            qSum += q
            if len(heap) == K:
                res = min(res, qSum * r)
                qSum += heapq.heappop(heap)    # 弹出工资最大的
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值