来源:力扣(LeetCode)

描述:

n 名工人。 给定两个数组 qualitywage ,其中,quality[i] 表示第 i 名工人的工作质量,其最低期望工资为 wage[i]

现在我们想雇佣 k 名工人组成一个工资组。在雇佣 一组 k 名工人时,我们必须按照下述规则向他们支付工资:

  1. 对工资组中的每名工人,应当按其工作质量与同组其他工人的工作质量的比例来支付工资。

  2. 工资组中的每名工人至少应当得到他们的最低期望工资。

给定整数 k ,返回 组成满足上述条件的付费群体所需的最小金额 。在实际答案的 10-5 以内的答案将被接受。

示例 1:

输入: quality = [10,20,5], wage = [70,50,30], k = 2
输出: 105.00000
解释: 我们向 0 号工人支付 70,向 2 号工人支付 35。

示例 2:

输入: quality = [3,1,10,10,1], wage = [4,8,2,2,7], k = 3
输出: 30.66667
解释: 我们向 0 号工人支付 4,向 2 号和 3 号分别支付 13.33333。

提示:

  • n == quality.length == wage.length
  • 1 <= k <= n <= 104
  • 1 <= quality[i], wage[i] <= 104

方法:贪心 + 优先队列

思路与算法

题目给出 n 名工人和他们的工作质量数组 quality 和薪资数组 wage。其中 quality[i] 表示第 i 名工人的工作质量,wage[i] 表示第 i 名工人的最低期望工资。现在我们需要选择 k 名工人来组成一个工资组,支付工资时我们需要按照下述的规则来向这些工人支付工资:

  1. 对工资组中的每名工人,应当按其工作质量与同组其他工人的工作质量的比例来支付工资。

  2. 工资组中的每名工人至少应当得到他们的最低期望工资。

然后我们需要求符合上述条件的最小支付金额。那么首先假设我们已经选择了某一个工资组,组成成员为 [h1 ,h2, ⋯, hk ],其中 hi 表示第 hi 个工人,整个工作组的总工作质量为:totalq,总的支付金额为 totalc。那么按照题目的要求对于任意工人 hi

需要满足:


即:

所以当某一个工资组的总工作质量固定时,最少的付费金额只与工资组中
有关。那么贪心的思路就出来了:设一个工人 i 在某一个工资组中的权重表示为

那么当我们以某一个工人 x 作为一个工资组中权重最高时,工资组中其他人员只需要在权重小于工人 x 的集合中选择工作质量最少的 k − 1 名工人来组成工资组即可,此时便能达到以工人 x 为权重最高的工资组的总工作量最小,从而达到以工人 x 为权重最高的工资组的最小工资开销。然后我们枚举以每一个能成为工资组中权重最大的工人来计算最小工资组开销,然后取其中的最小即可。在处理的过程中,我们可以先将工人按照权重进行升序排序,然后在遍历过程中可以用优先队列来维护之前工作质量最少的 k − 1 名工人。

代码:

class Solution {public:double mincostToHireWorkers(vector<int>& quality, vector<int>& wage, int k) {int n = quality.size();vector<int> h(n, 0);iota(h.begin(), h.end(), 0);sort(h.begin(), h.end(), [&](int& a, int& b) {return quality[a] * wage[b] > quality[b] * wage[a];});double res = 1e9;double totalq = 0.0;priority_queue<int, vector<int>, less<int>> q;for (int i = 0; i < k - 1; i++) {totalq += quality[h[i]];q.push(quality[h[i]]);}for (int i = k - 1; i < n; i++) {int idx = h[i];totalq += quality[idx];q.push(quality[idx]);double totalc = ((double) wage[idx] / quality[idx]) * totalq;res = min(res, totalc);totalq -= q.top();q.pop();}return res;}
};

执行用时:32 ms, 在所有 C++ 提交中击败了79.79%的用户
内存消耗:19.6 MB, 在所有 C++ 提交中击败了95.21%的用户
复杂度分析
时间复杂度:O(n × logn),主要为排序和每一个元素进出优先队列的时间复杂度。
空间复杂度:O(n),主要为排序的辅助数组和优先队列的空间开销。
author:LeetCode-Solution

【857. 雇佣 K 名工人的最低成本】相关推荐

  1. 力扣 857. 雇佣 K 名工人的最低成本

    题目 有 n 名工人. 给定两个数组 quality 和 wage ,其中,quality[i] 表示第 i 名工人的工作质量,其最低期望工资为 wage[i] . 现在我们想雇佣 k 名工人组成一个 ...

  2. 857. 雇佣 K 名工人的最低成本

    有 n 名工人. 给定两个数组 quality 和 wage ,其中,quality[i] 表示第 i 名工人的工作质量,其最低期望工资为 wage[i] . 现在我们想雇佣 k 名工人组成一个工资组 ...

  3. 【数组】雇佣 K 名工人的最低成本

    题目描述 有 n 名工人. 给定两个数组 quality 和 wage ,其中,quality[i] 表示第 i 名工人的工作质量,其最低期望工资为 wage[i] . 现在我们想雇佣 k 名工人组成 ...

  4. LeetCode题解(0857):雇佣K名工人的最低成本(Python)

    题目:原题链接(困难) 标签:堆.贪心算法 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(NlogN)O(NlogN)O(NlogN) O(N)O(N)O(N) 280ms ...

  5. 雇佣K个工人的最小费用 Minimum Cost to Hire K Workers

    2018-10-06 20:17:30 问题描述: 问题求解: 问题规模是10000,已经基本说明是O(nlogn)复杂度的算法,这个复杂度最常见的就是排序算法了,本题确实是使用排序算法来进行进行求解 ...

  6. LeetCode题解(1000):合并石头的最低成本(Python)

    题目:原题链接(困难) 标签:动态规划 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O ( N 4 ) O(N^4) O(N4) O ( N 3 ) O(N^3) O(N3) ...

  7. 2021-08-24:合并石头的最低成本。有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头。每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的

    2021-08-24:合并石头的最低成本.有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头.每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的 ...

  8. LeetCode 1000. 合并石头的最低成本(区间DP)

    文章目录 1. 题目 2. 解题 1. 题目 有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆 ...

  9. 校园卡水卡最低成本破解具体过程(补上上次工具教程)By:dj1149 -02

    校园卡水卡最低成本破解具体过程(补上上次工具教程)By:dj1149 -02 有必要申明下:以下是分享工具用法和破解过程,大家切勿做违法的事情 别问我银行卡行不行... 大家拿不联网的卡练手就好了 上 ...

最新文章

  1. 计算机培训操作规程,电脑裁床操作规程
  2. GitHub、Git与TortoiseGit基本操作
  3. 【科普】STP生成树协议
  4. (转) OpenLayers3基础教程——OL3 介绍control
  5. UVa 10603 Fill (BFS+优先队列)
  6. lampp mysql 等待响应时间很长_Apache 打开网页的时候等待时间过长的解决方案
  7. vue 添加子路由,并对路由重定向
  8. yytext table html,快速掌握YYText
  9. Elas Digital:定义一个Token的最简易方法
  10. AI智能合同审阅系统
  11. Effective Modern C++ 完全解读笔记汇总
  12. 使用java、html5以及wPaint实现在线编辑图片并保存到FTP中的功能,在线图片为iis服务
  13. Luogu P4944 【PION贪吃蛇】
  14. 帝国cms根据标题生成标题图片插件
  15. 【转贴】看星际争霸人工智能伯克利如何“主宰”了“2010星际争霸人工智能挑战赛”...
  16. 面试系列--自我了解和自我剖析
  17. Axure RP一个专业的快速原型设计工具
  18. 3dmax:3dmax三维VR渲染设置之高级灯光渲染(经典案例—利用自由聚光灯制作筒灯效果效果)图文教程
  19. 去公司刚开发怎么启动项目
  20. MIMIKATZ编译教程

热门文章

  1. python万年历实现代码_python万年历实现代码 含运行结果
  2. Attention注意力机制学习(三)------->从Attention到Transformer再到BERT
  3. 【Windows】中英文切换快捷键Caps
  4. 大学生网页大作业|前端练习
  5. 全球知名移动间谍软件FlexiSpy的分析(part2)
  6. 2022年高处吊篮安装拆卸工(建筑特殊工种)考试练习题模拟考试平台操作
  7. backbone java_backbone简介_动力节点Java学院整理
  8. vue实现excel文件的导入和读取
  9. 在家远程办公第一天,看看哪些互联网公司内网团灭了
  10. vue结合 element-ui实现强大的后台管理系统表格组件