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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a786150017/article/details/84785490

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

猜你喜欢

转载自blog.csdn.net/a786150017/article/details/84785490
今日推荐