857. 雇佣 K 名工人的最低成本
题目链接:857. 雇佣 K 名工人的最低成本
代码如下:
//参考:https://leetcode.cn/problems/minimum-cost-to-hire-k-workers/solutions/1815856/yi-bu-bu-ti-shi-ru-he-si-kao-ci-ti-by-en-1p00
class Solution
{
public:
double mincostToHireWorkers(vector<int>& quality, vector<int>& wage, int k)
{
vector<int> id(quality.size());
int sum_q=0;
iota(id.begin(),id.end(),0);//有助于快速生成递增的序列
sort(id.begin(),id.end(),[&](int& i,int& j)
{
return wage[i]*quality[j]<wage[j]*quality[i];//按照r值排序
});
priority_queue<int> pq;//默认大根堆
for(int i=0;i<k;i++)
{
pq.push(quality[id[i]]);
sum_q+=quality[id[i]];
}
//选r值最小的k名工人组成当前的最优解
double res=sum_q*(double)wage[id[k-1]]/quality[id[k-1]];
for(int i=k;i<quality.size();i++)
{
if(int q=quality[id[i]];q<pq.top())//sum_q可以变小,从而可能得到更优的答案
{
sum_q-=pq.top()-q;
pq.pop();
pq.push(q);
res=min(res,sum_q*(double)wage[id[i]]/q);
}
}
return res;
}
};