857.雇佣K名工人的最低成本|贪心|优先队列|困难|公式转换

这篇博客探讨了一个关于如何以最小成本雇佣工人的算法问题。通过将工人的性价比排序,选取性价比最高的员工,并利用贪心策略逐步构建工资组。文章详细解释了如何利用Python的zip和sorted函数对数据进行处理,并通过堆数据结构优化求解过程,以确保满足每名工人期望工资的同时,降低总体成本。

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

在这里插入图片描述
一、想不出思路,看官方题解

在这里插入图片描述
我的理解:

  • “对工资组中的每名工人,应当按其工作质量与同组其他工人的工作质量的比例来支付工资。”将这句话翻译为:
    “当固定了某K个工人为一组时,工人k1的质量q1作分子,质量和totalq作分母,再乘以总的发的工资totalw,就是他能拿到的工资w1”,这个w1必须大于等于他期望的工资,才是合理的分组。

  • 将不等式变换下,可知最小分发工资的影响因素为(组里最大的性价比w/q)、以及(总质量)。

  • 贪心:先将所有小的性价比员工放进来(卷的员工,质量高、钱要的还少),然后枚举以每一个能成为工资组中权重(性价比)最大的工人(固定一个变量,剔除质量太高的)来计算最小工资组开销,然后取其中的最小即可。

python 函数

  • zip() :将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象
    在这里插入图片描述
  • sorted():使用 sorted() 函数对序列进行排序, 并不会在原序列的基础进行修改,而是会重新生成一个排好序的列表。
    在这里插入图片描述

代码

class Solution:
    def mincostToHireWorkers(self, quality: List[int], wage: List[int], k: int) -> float:
        # 将每个员工按性价比(wage/quality)从小到大排序
        # 越小,说明取得是质量高、期待工资还低的员工,卷的员工
        ratio = sorted(zip(quality, wage), key = lambda p: p[1] / p[0])
	
        totalq = 0
        # res = 0
        res = inf
        # 堆,存放quality质量,按照推理的公式,totalq越小越好,所以构建大根堆,每次优先去掉质量高的
        Qheap = []

        # i = 0
        for qua, wage in ratio[:k-1]: # 取前k-1个
            totalq += qua
            heappush(Qheap, -qua) # 默认构建小根堆,取负使得大根堆
            # i += 1
            # if i == k:
            #     res = wage / qua * totalq # 最后的结果,最小给与的工资就是该等式
            
        for qua, wage in ratio[k-1:]:
            # 确定当前工人为最大性价比的时候,最小工资只与其性价比和总质量有关
            totalq += qua
            heappush(Qheap, -qua)

            res = min(res, wage/qua * totalq)
             
            #去掉质量最高的
            totalq += heappop(Qheap) # 取出来是负值,相当于将去最高质量的工人

        
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值