857. Minimum Cost to Hire K Workers

题目传送门

题目分析

这个问题思考的几个关键点。

  • 假如我们雇佣了K名员工,那么我们计算这K名员工的工资需要进行如下步骤:计算每个员工的每quality需要的wage,即ratio[i] = wage[i] / quality[i]。之后这K名员工的工资为,sum(max_ratio * quality[i])
  • 由上一个计算过程可知,影响K名员工工资总额的因素有两个max_ratiosum(quality)。因此我们对ratio进行排序,优先选取那些ratio的员工计算,但是仅凭这个我们并不能得出最优解,因为我们可能会由于其quality总额过大导致K名工资过高。因此我们还需要不断对这两个数值进行平衡。平衡过程就是,引入更大ratio员工(毕竟要包成K名员工),排除quality过大的员工。
代码
class Solution {
public:

    double mincostToHireWorkers(vector<int>& quality, vector<int>& wage, int K) {
        vector<pair<double, int>> ratio;
        vector<pair<int, int>> quaAmount;
        int quaSum{0};
        double minPaied = INT64_MAX;
        for(int i = 0; i < quality.size(); i++)
            ratio.push_back({static_cast<double>(wage[i]) / quality[i], i});
        sort(ratio.begin(), ratio.end(), [](pair<double, int> &a, pair<double, int> &b)->bool {return a.first < b.first;});
        for(int i = 0; i < K - 1; i++){
            quaSum += quality[ratio[i].second];
            quaAmount.push_back({quality[ratio[i].second], ratio[i].second});
        }
        make_heap(quaAmount.begin(), quaAmount.end(), [](pair<int, int> &a, pair<int, int> &b)->bool {return a.first < b.first;});   
        for(int i = K - 1; i < ratio.size(); i++){
            quaAmount.push_back({quality[ratio[i].second], ratio[i].second});
            quaSum += quality[ratio[i].second];
            minPaied = min(minPaied, quaSum * ratio[i].first);
            push_heap(quaAmount.begin(), quaAmount.end(), [](pair<int, int> &a, pair<int, int> &b)->bool {return a.first < b.first;});
            quaSum -= quaAmount.front().first;
            pop_heap(quaAmount.begin(), quaAmount.end(), [](pair<int, int> &a, pair<int, int> &b)->bool {return a.first < b.first;});
            quaAmount.pop_back();
        }
        return minPaied;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值