题目描述

有 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 名工人的最低成本相关推荐

  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. 【857. 雇佣 K 名工人的最低成本】

    来源:力扣(LeetCode) 描述: 有 n 名工人. 给定两个数组 quality 和 wage ,其中,quality[i] 表示第 i 名工人的工作质量,其最低期望工资为 wage[i] . ...

  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】合并石头的最低成本 [H](动态规划)

    1000. 合并石头的最低成本 - 力扣(LeetCode) 一.题目 有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而 ...

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

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

最新文章

  1. ansible playbook中使用迭代with_items案例
  2. FFmpeg资料来源简单分析:libswscale的sws_getContext()
  3. nginx php-fpm 输出php错误日志(转)
  4. Java ClassLoader getPackage()方法与示例
  5. winform第三方控件wmp
  6. 电脑怎么进入linux系统,Linux操作系统进入家用电脑成为发展新前景
  7. 【小程序项目分享】多功能抽签分组系统
  8. [干货]手把手教你写一个安卓app
  9. java 抓smail_java如何定位代码到smail里,如图0.0
  10. Spire.pdf Pdf添加图片,无水印
  11. matlab hold all,Matlab中的命令hold on hold off | 学步园
  12. PyCharm的cache缓存文件清理
  13. 将MP4文件在网页端播放
  14. python新打包工具,最好用的版本之一,不接受反驳
  15. 按键控制LED亮灭(CC2530)
  16. jqgrid控制多选按钮显示隐藏
  17. open judge 1.7.1
  18. java操作word,自动更新目录/域
  19. hadoop集群部署超级详细
  20. guava学习:RangeSet

热门文章

  1. C#学习记录——软件工程师必备素养与技能
  2. vim 错误提示解决:The ycmd server SHUT DOWN (restart with ‘:YcmRestartServer‘). Unexpected exit code 1.
  3. Linux嵌入式设备内存问题定位
  4. pikachu通关笔记(九)
  5. 支付宝支持给微信好友转账/ 14家自动驾驶概念股均价已蒸发80%/ 苹果M2 iPad Pro推出在即…今日更多新鲜事在此...
  6. SYSU-1,URAL 1894,闽科夫斯基和(黑科技)
  7. 1.三轮全向移动底盘运动学解析
  8. 2020 年编程语言盘点展望:Java 老兵不死,Kotlin 蓄势待发
  9. 软件工程项目——租船系统(Python+PyQt5实现)
  10. 关于级联选择器Cascader数据太多会改变列表大小的问题