每日一题:857. 雇佣 K 名工人的最低成本

知识浅谈 🐄🐄🐄🐄🐄大佬
后端领域优质创作者
博客专家认证
2022-09-11 09:49:34

题意

有 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。
示例 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

题解

class Solution {
    public double mincostToHireWorkers(int[] quality, int[] wage, int k) {
        int n = quality.length;
        double[][] rec = new double[n][2];
        for(int i=0;i<n;i++){
            rec[i] = new double[]{(double)wage[i]/(double)quality[i],quality[i]};
        }
        Arrays.sort(rec,(a,b)->Double.compare(a[0],b[0]));
        PriorityQueue<Double>queue = new PriorityQueue<>();
        int num=0; //记录总质量数
        double res=Double.MAX_VALUE,t;
        for(int i=0;i<n;i++){
            queue.offer(-rec[i][1]);
            num+=rec[i][1];
            t = queue.size();
            if(t>k){
                num+=queue.poll();
                t--;
            }
            if(t==k){
                res = Math.min(res,num*rec[i][0]);
            }
        }
        return res;
    }
}

img

...全文
124 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

9,527

社区成员

发帖
与我相关
我的任务
社区描述
知识浅谈(万道面试题)社区,旨在为找工作的小伙伴提供技术内容共享学习平台,助力每位小伙伴找到好工作,欢迎各位小伙伴的加入。
jvm小程序java 个人社区 吉林省·长春市
社区管理员
  • 知识浅谈
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

【社区倡导与禁止】

  • 社区倡导积极发帖,互相交流技术问题,学习心得。
  • 社区不限制技术领域,后端内容增加加精权重
  • 社区禁止发布低俗、不健康的内容

【社区积分规则】

  • 在社区「发帖」得10积分
  • 内容被管理员「加精」得10积分
  • 点赞他人内容得1积分
  • 评论内容得2积分

试试用AI创作助手写篇文章吧