📅  最后修改于: 2023-12-03 15:40:14.341000             🧑  作者: Mango
在一些生产型工作中,我们需要雇佣K个工人来完成一项任务,并且工人的速度和效率各不相同。为了让效率最高,我们需要最大化K个工人的速度和他们的最小效率之和的乘积。
给定长度为 n
的正整数数组 speed
和效率数组 efficiency
,其中 speed[i]
和 efficiency[i]
分别表示第 i 位工人的速度和效率。选择K个工人组成一个团队,则该团队的最小效率为这K个工人中效率最低的那个数值,且该团队的工作速度为这K个工人的速度之和。基于此,我们定义团队的表现值为该团队的工作速度与最小效率之积。
请你计算并返回所能达到的最大团队表现值。
输入:k = 3, speed = [2,4,5,5,5], efficiency = [3,7,2,4,6]
输出:60
解释:使用速度为 2、4 和 5 的工人组成团队,团队最小效率为 4,工作速度为 11,团队表现值为 44。选择效率是 [7,4,6]的第二个工人来替换效率为 2 的工人,其余条件保持不变,则团队表现值为 52。选择效率是 [7,4,6] 的前三个工人,其余条件保持不变,则团队表现值为 60。
为了得到最大的团队表现值,我们需要做两个事情:
对于第一个问题,我们可以对效率进行排序,然后选取最小的K个值求和,这样效率最低的那个值就是这K个值中的最小值。
对于第二个问题,我们可以遍历排序后的效率数组,从效率最高的工人往回倒序遍历,每次计算当前工人为最低效率的情况下,可以组成的最大速度。这里可以使用一个大根堆来保存当前遍历到的K个工人中最慢的速度,然后每次替换掉堆中最慢的工人,更新最大速度。
import heapq
def maxPerformance(n: int, speed: List[int], efficiency: List[int], k: int) -> int:
res = 0
hq = []
cur_speed = 0
lst = sorted(zip(efficiency, speed), reverse=True)
for e, s in lst:
if len(hq) == k:
cur_speed -= heapq.heappop(hq)
heapq.heappush(hq, s)
cur_speed += s
res = max(res, cur_speed * e)
return res % (10 ** 9 + 7)
该解法的时间复杂度为O(nlogn),空间复杂度为O(n)。