zoukankan      html  css  js  c++  java
  • leetcode_雇佣 K 名工人的最低成本(优先级队列,堆排序)

    题干:

    有 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=999999999;
            vector<vector<double> > x(y,vector<double>(2));
            for(int i=0;i<y;i++){
                x[i][0]=(double)wage[i]/quality[i];
                x[i][1]=quality[i];
            }
            sort(x.begin(),x.end());
            priority_queue<double> q;
            int tmp=0;
            for(auto z:x){
                q.push(z[1]);
                tmp+=z[1];
                if(q.size()==K){
                    result=min(tmp*z[0], result);
                    tmp-=q.top();
                    q.pop();
                }
            }
            return result;
        }
    };

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

  • 相关阅读:
    Surface RT2装Win10出现 "INF不包含数字签名信息"【已解决】
    树上倍增LCA模版
    sql注入
    python 调用 telnet
    ss
    【总结氵】2021.02.27 省选模拟
    2021.03.13省选模拟 抽卡(card)
    树链剖分之重链剖分 模板
    多项式求逆 模板
    NTT快速数论变换 模板
  • 原文地址:https://www.cnblogs.com/missouter/p/12738114.html
Copyright © 2011-2022 走看看