题干:

有 N 名工人。 第 i 名工人的工作质量为 quality[i] ,其最低期望工资为 wage[i] 。

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

对工资组中的每名工人,应当按其工作质量与同组其他工人的工作质量的比例来支付工资。
工资组中的每名工人至少应当得到他们的最低期望工资。
返回组成一个满足上述条件的工资组至少需要多少钱。

看完题干第一反应是个贪心题,先算出所有员工的性价比wage/quality,最后的结果必然是某个员工刚刚好拿到最低工资,其他员工按该员工的性价比比例分配;求出所有可能的值选取最小的方法通过剪枝也许可行…但基本还是使用主流的堆排序方法比较稳妥。

需要使用的优先级队列在头文件queue.h中调用,默认为一个大根堆。将工人按性价比升序排序后,其quality依次入队,队列大小满k后将性价比*总quality算出最终工资,与最小值比较后进行取值,最后将队列首部弹出(默认大根堆,弹出最大quality元素),再重复入队,弹出,最终得到最小应付工资。

这就是资本家?

贴代码:

class Solution {
public:
double mincostToHireWorkers(vector<int>& quality, vector<int>& wage, int K) {
int y=wage.size();
double result=;
vector<vector<double> > x(y,vector<double>());
for(int i=;i<y;i++){
x[i][]=(double)wage[i]/quality[i];
x[i][]=quality[i];
}
sort(x.begin(),x.end());
priority_queue<double> q;
int tmp=;
for(auto z:x){
q.push(z[]);
tmp+=z[];
if(q.size()==K){
result=min(tmp*z[], result);
tmp-=q.top();
q.pop();
}
}
return result;
}
};

值得注意的是leetcode的vector用作二维数组初始化方式,行列都要初始化(?)。在进行性价比的计算还需强制转换类型double,不然结果一直是整数。

leetcode_雇佣 K 名工人的最低成本(优先级队列,堆排序)的更多相关文章

  1. [Swift]LeetCode857. 雇佣 K 名工人的最低成本 | Minimum Cost to Hire K Workers

    There are N workers.  The i-th worker has a quality[i] and a minimum wage expectation wage[i]. Now w ...

  2. 贪心-谷歌-857. 雇佣 K 名工人的最低成本

    2020-03-15 22:00:39 问题描述: 有 N 名工人. 第 i 名工人的工作质量为 quality[i] ,其最低期望工资为 wage[i] . 现在我们想雇佣 K 名工人组成一个工资组 ...

  3. [LeetCode] 857. Minimum Cost to Hire K Workers 雇佣K名工人的最低成本

    There are N workers.  The i-th worker has a quality[i] and a minimum wage expectation wage[i]. Now w ...

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

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

  5. [Swift]LeetCode1000. 合并石头的最低成本 | Minimum Cost to Merge Stones

    There are N piles of stones arranged in a row.  The i-th pile has stones[i] stones. A move consists ...

  6. Leetcode1000 合并石头的最低成本 区间DP

    有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的总数. 找出把所有石头合并成一堆的最低成 ...

  7. PTA 畅通工程之最低成本建设问题(30 分)(最小生成树 krusal)

    畅通工程之最低成本建设问题(30 分) 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路 ...

  8. 7-12 畅通工程之最低成本建设问题(30 point(s)) 【PRIME】

    7-12 畅通工程之最低成本建设问题(30 point(s)) 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出"畅通工程"的目标:使整个地区任何两个城镇间 ...

  9. [LeetCode] 857. Minimum Cost to Hire K Workers 雇K个工人的最小花费

    There are N workers.  The i-th worker has a quality[i] and a minimum wage expectation wage[i]. Now w ...

随机推荐

  1. PHP代码审计(初级篇)

    一.常见的PHP框架 1.zendframwork: (ZF)是Zend公司推出的一套PHP开发框架 功能非常的强大,是一个重量级的框架,ZF 用 100%面向对象编码实现. ZF 的组件结构独一无二 ...

  2. 让ul li水平居中(任意删除li也能水平居中)

    HTML代码: <div class="box"> <ul class="button-ct"> <li></li&g ...

  3. work of 1/6/2016

    part 组员                今日工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云 UI动态布局改进和攻克疑难     6 继续下滑条等增删补减 ...

  4. B - Red and Black 直接BFS+队列

    There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A ...

  5. 关于phpstorm、idea、gogland等等ide全家桶设置

    2017-08-29 16:30:55 Preferences => IDE Settings => Editor => Code Completion => Autopopu ...

  6. Linux 日常操作

    Linux 日常操作 */--> Linux 日常操作 Table of Contents 1. 查看硬件信息 1.1. 服务器型号序列号 1.2. 主板型号 1.3. 查看BIOS信息 1.4 ...

  7. VideoView--简单获取进度条的方法

    使用MediaController类就可以简单的把视频中的进度条加进去 实例: 现在布局哪里放一个VideoView,然后: videoView = (VideoView) findViewById( ...

  8. ThinkPHP3.2自定义配置和加载

    有时候我们会有一些规则定义每个数字对应的实际内容,比如说在下拉菜单的时候: <select name="reasonAndType" id=""> ...

  9. linux--配置开发环境 --Nginx篇

    安装: 安装好了话,我们的nginx的目录在:  /etc/nginx 启动: sudo service nginx start 然后访问我们的页面就可以看到了我们的界面 然后我们配置我们的域名: 我 ...

  10. 2019-2020-1 20199310《Linux内核原理与分析》第四周作业

    1.问题描述 在前面的文章中,已经接触过一些Linux内核的知识,本文将进一步从Linux内核源代码的目录结构入手,在Oracle VM VirtualBox的Linux环境中构造一个简单的操作系统M ...