Java C++ 题解leetcode857雇佣K名工人最低成本vector pair

题目描述:

给定两个长度为N的整数数组,W数组表示每个工人的工资,Q数组表示每个工人完成工作的质量。
现在要雇佣K名工人去完成一些工作,每个工人只能完成一项工作,工人完成一项工作的质量就是该工作质量的总和,而这些工作的总成本是所有工人的工资总和。
求最小的总成本。

思路分析:

先将工资按比例排序,使用最小堆,维护当前最小的K个工资,同时记录下当前最小K个工资的序号,计算每个工人的价格,返回最小值即可。

代码实现:

class Worker
{
public:
    int quality;
    int wage;
    double ratio;
    Worker(int q, int w) : quality(q), wage(w), ratio(double(w) / double(q)){}
    bool operator<(const Worker& a)const
    {
        return ratio < a.ratio;
    }
};

class Solution {
public:
    double mincostToHireWorkers(vector<int>& quality, vector<int>& wage, int K) {
        vector<Worker>workers;
        int n = quality.size();
        for (int i = 0; i < n; i++) {
            workers.push_back(Worker(quality[i], wage[i]));
        }
        sort(workers.begin(), workers.end());
        priority_queue<int>pq;
        double res = DBL_MAX;
        int work_quality = 0;
        for (auto worker : workers) {
            int q = worker.quality;
            int w = worker.wage;
            double r = worker.ratio;
            pq.push(q);
            work_quality += q;
            if (pq.size() > K) {
                int dq = pq.top();
                pq.pop();
                work_quality -= dq;
            }
            if (pq.size() == K) {
                res = min(res, work_quality * r);
            }
        }
        return res;
    }
};

示例1:

输入:

quality = [10,20,5], wage = [70,50,30], K = 2

输出:

105

解释:

雇用第一名工人完成质量为10的工作,并支付 70$。雇用第二名工人完成质量为20的工作,并支付 50$。

示例2:

输入:

quality = [3,1,10,10,1], wage = [4,8,2,2,7], K = 3

输出:

30.66667

解释:

雇用第一名工人完成质量为3的工作,并支付 4$。雇用第二名工人完成质量为7的工作,并支付 7$。雇用第三名工人完成质量为10的工作,并支付 19.33333$。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java C++ 题解leetcode857雇佣K名工人最低成本vector pair - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • spring boot实现在request里解密参数返回

    接下来我将为你详细讲解“Spring Boot实现在Request里解密参数返回”的完整攻略。在讲解前,我先对该攻略中的几个关键点进行解释: Request:Request是HTTP请求的对象,可以用来获取请求的参数、头信息、请求方法等内容。 解密参数:在网络请求过程中,为了保证传输数据的安全性,往往需要对数据进行加密处理。因此,在接收到数据时需要进行解密操…

    Java 2023年6月16日
    00
  • Java利用for循环输出空心三角形、空心菱形和空心矩形的代码

    让我们来详细讲解Java利用for循环输出空心三角形、空心菱形和空心矩形的代码。 输出空心三角形 首先,我们要理解空心三角形的形状,它是由多个递进的空格和星号组成的,而每行的符号数都是依次递增或递减的。 下面是一个输出空心三角形的示例代码: public class HollowTriangle { public static void main(Strin…

    Java 2023年5月26日
    00
  • java组件smartupload实现上传文件功能

    下面是关于“java组件smartupload实现上传文件功能”的完整攻略,包含两个示例。 SmartUpload 简介 SmartUpload 是一个 Java 组件,能够方便地实现上传文件的功能。它提供了上传文件的基本方法,并可以使用 Java 类库自身的方法来读取这些文件。SmartUpload 支持批量上传,支持上传时的文件类型检查等功能。 Smar…

    Java 2023年5月19日
    00
  • 基于Three.js实现360度全景图片

    下面我来详细讲解“基于Three.js实现360度全景图片”的完整攻略。 什么是Three.js Three.js是JavaScript编写的一个3D渲染引擎。它基于WebGL,可用于在网页上创建复杂的3D交互和视觉效果。Three.js是开源的,由Mr.doob写成,是现今最为流行的3D库之一。 什么是360度全景图片 360度全景图片就是将一个场景完全拍…

    Java 2023年6月15日
    00
  • Java项目实战之在线考试系统的实现(系统介绍)

    Java项目实战之在线考试系统的实现(系统介绍) 系统功能介绍 在线考试系统是一款基于Java语言开发的在线考试工具,旨在为教师提供创建、管理在线考试的便利。系统主要功能包括: 用户管理:支持管理员添加、修改和删除用户,用户身份分为管理员、教师和学生三种。 考试管理:支持管理员和教师创建、修改和提供考试安排,同时学生可在规定时间内参加考试。 题库管理:管理员…

    Java 2023年5月23日
    00
  • SpringBoot集成WebSocket【基于纯H5】进行点对点[一对一]和广播[一对多]实时推送

    下面将对“SpringBoot集成WebSocket进行点对点和广播实时推送”的完整攻略进行详细讲解,建议您认真阅读。 概述 WebSocket是HTML5推出的一种新型协议,它类似于HTTP协议,但对服务器尤其友好。它允许服务器在任何时刻向客户端推送数据,而不必等待客户端去请求。相对于传统的Ajax轮询方式,WebSocket更加高效、实时。 Spring…

    Java 2023年5月20日
    00
  • Springboot 使用内置tomcat禁止不安全HTTP的方法

    下面是详细的讲解“Spring Boot使用内置Tomcat禁止不安全HTTP的方法”的攻略: 1. 概述 Spring Boot本身就可以使用内置Tomcat服务器来快速构建Web应用程序。默认情况下,Tomcat服务器可以同时支持HTTP和HTTPS两种协议,但是其中HTTP协议是不安全的。为了保证应用程序的安全性,我们需要禁止使用不安全的HTTP协议,…

    Java 2023年5月20日
    00
  • 一文带你学会Spring JDBC的使用

    一文带你学会Spring JDBC的使用 简介 Spring JDBC是基于JDBC的框架,它提供了许多方便的功能去简化JDBC编码的繁琐。它可以自动管理连接、传播事务,同时提供了一种直观且简洁的方式去执行SQL语句,Spring JDBC已成为了Java应用程序中访问数据库的首选。本文将介绍如何使用Spring JDBC去连接数据库、执行SQL查询与更新,…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部