【数组】雇佣 K 名工人的最低成本
题目描述
有 n 名工人。 给定两个数组 quality 和 wage ,其中,quality[i] 表示第 i 名工人的工作质量,其最低期望工资为 wage[i] 。
现在我们想雇佣 k 名工人组成一个工资组。在雇佣 一组 k 名工人时,我们必须按照下述规则向他们支付工资:
对工资组中的每名工人,应当按其工作质量与同组其他工人的工作质量的比例来支付工资。
工资组中的每名工人至少应当得到他们的最低期望工资。
给定整数 k ,返回 组成满足上述条件的付费群体所需的最小金额 。在实际答案的 10-5 以内的答案将被接受。。
示例 1:
输入: quality = [10,20,5], wage = [70,50,30], k = 2
输出: 105.00000
解释: 我们向 0 号工人支付 70,向 2 号工人支付 35。
解题思路
这道题需要使用贪心算法,通过贪心算法可以降低时间复杂度;
可以得到:总工资= 总量 * radio(选择出的数据中最大的radio); 这个也可以通过公式推算,推算后结论:总工资>= 总量 * wage[i]/quality[i];其中radio[i] = wage[i]/quality[i];
根据这些信息思路如下:
- 准备一个Worker,里面存储:wage、quality、radio;
- 准备一个List,将Worker加入到List中,并按照radio进行升序排序;
- 准备一个优先队列,PriorityQueue<Worker> queue,这个queue按照quality从大到小排序;
- 将Worker 从 0 到 k-2 加入到queue,并且执行 total+=quality[i];
- 执行循环遍历
- 将Worker 从 k-1 到 quality.length-1;
- 执行 total+=quality[i];
- 计算 res = Math.min(res, total * wage[i]/quality[i])
- 计算完成后,从queue中移除最大quality的元素,即Worker worker = queue.offer(),并且执行total -= worker.quality;
- 最后返回res。
代码实现如下:
import java.util.*;class Solution {public double mincostToHireWorkers(int[] quality, int[] wage, int k) {List<Worker> list = new ArrayList<>(quality.length);for (int i = 0; i < quality.length; i++) {list.add(new Worker(quality[i], wage[i]));}Collections.sort(list);double res = Integer.MAX_VALUE;Double total = 0D;PriorityQueue<Worker> queue = new PriorityQueue<>(new Comparator<Worker>() {@Overridepublic int compare(Worker o1, Worker o2) {return o2.quality - o1.quality;}});for (int i = 0; i < k - 1; i++) {queue.offer(list.get(i));total += list.get(i).quality;}for (int i = k - 1; i < quality.length; i++) {queue.offer(list.get(i));total += list.get(i).quality;res = Math.min(res, total * list.get(i).radio);total -= queue.poll().quality;}return res;}static class Worker implements Comparable<Worker> {int quality;int wage;double radio;Worker(int quality, int wage) {this.quality = quality;this.wage = wage;this.radio = (double) wage / (double) quality;}@Overridepublic int compareTo(Worker o) {return Double.compare(radio, o.radio);}}
}
总结
这道题是一道困难题,核心还是找到数学规律,我是看了其他人的解决思路后,再自己做了一次实现,核心还是没有从现象上找到真正的数学规律。如果有更加简洁、高效的实现欢迎回复。
【数组】雇佣 K 名工人的最低成本相关推荐
- 力扣 857. 雇佣 K 名工人的最低成本
题目 有 n 名工人. 给定两个数组 quality 和 wage ,其中,quality[i] 表示第 i 名工人的工作质量,其最低期望工资为 wage[i] . 现在我们想雇佣 k 名工人组成一个 ...
- 857. 雇佣 K 名工人的最低成本
有 n 名工人. 给定两个数组 quality 和 wage ,其中,quality[i] 表示第 i 名工人的工作质量,其最低期望工资为 wage[i] . 现在我们想雇佣 k 名工人组成一个工资组 ...
- 【857. 雇佣 K 名工人的最低成本】
来源:力扣(LeetCode) 描述: 有 n 名工人. 给定两个数组 quality 和 wage ,其中,quality[i] 表示第 i 名工人的工作质量,其最低期望工资为 wage[i] . ...
- LeetCode题解(0857):雇佣K名工人的最低成本(Python)
题目:原题链接(困难) 标签:堆.贪心算法 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(NlogN)O(NlogN)O(NlogN) O(N)O(N)O(N) 280ms ...
- 雇佣K个工人的最小费用 Minimum Cost to Hire K Workers
2018-10-06 20:17:30 问题描述: 问题求解: 问题规模是10000,已经基本说明是O(nlogn)复杂度的算法,这个复杂度最常见的就是排序算法了,本题确实是使用排序算法来进行进行求解 ...
- LeetCode题解(1000):合并石头的最低成本(Python)
题目:原题链接(困难) 标签:动态规划 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O ( N 4 ) O(N^4) O(N4) O ( N 3 ) O(N^3) O(N3) ...
- 2021-08-24:合并石头的最低成本。有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头。每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的
2021-08-24:合并石头的最低成本.有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头.每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的 ...
- 【LeetCode】合并石头的最低成本 [H](动态规划)
1000. 合并石头的最低成本 - 力扣(LeetCode) 一.题目 有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而 ...
- LeetCode 1000. 合并石头的最低成本(区间DP)
文章目录 1. 题目 2. 解题 1. 题目 有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆 ...
最新文章
- ansible playbook中使用迭代with_items案例
- FFmpeg资料来源简单分析:libswscale的sws_getContext()
- nginx php-fpm 输出php错误日志(转)
- Java ClassLoader getPackage()方法与示例
- winform第三方控件wmp
- 电脑怎么进入linux系统,Linux操作系统进入家用电脑成为发展新前景
- 【小程序项目分享】多功能抽签分组系统
- [干货]手把手教你写一个安卓app
- java 抓smail_java如何定位代码到smail里,如图0.0
- Spire.pdf Pdf添加图片,无水印
- matlab hold all,Matlab中的命令hold on hold off | 学步园
- PyCharm的cache缓存文件清理
- 将MP4文件在网页端播放
- python新打包工具,最好用的版本之一,不接受反驳
- 按键控制LED亮灭(CC2530)
- jqgrid控制多选按钮显示隐藏
- open judge 1.7.1
- java操作word,自动更新目录/域
- hadoop集群部署超级详细
- guava学习:RangeSet
热门文章
- C#学习记录——软件工程师必备素养与技能
- vim 错误提示解决:The ycmd server SHUT DOWN (restart with ‘:YcmRestartServer‘). Unexpected exit code 1.
- Linux嵌入式设备内存问题定位
- pikachu通关笔记(九)
- 支付宝支持给微信好友转账/ 14家自动驾驶概念股均价已蒸发80%/ 苹果M2 iPad Pro推出在即…今日更多新鲜事在此...
- SYSU-1,URAL 1894,闽科夫斯基和(黑科技)
- 1.三轮全向移动底盘运动学解析
- 2020 年编程语言盘点展望:Java 老兵不死,Kotlin 蓄势待发
- 软件工程项目——租船系统(Python+PyQt5实现)
- 关于级联选择器Cascader数据太多会改变列表大小的问题