857. Minimum Cost to Hire K Workers
题目大意:n个工人有不同的能力值,和 需要的最低工资,现在需要至少m个工人, 其中这m个工人需要满足他们的最低工资,而且他们的能力的比值和工资的比值要相等。问m个工人至少要花费多少钱。
解题思路:考虑到 能力的比值要等于工资的比值,即 Wa/Wb = Qa/Qb <=>Wa / Qa = Wb/Qb ,所以最终的m个人工资和能力的比值是相同的。而最终的支付的工资是 这个比值*能力值的和。
所以可以先按照比值排序,用一个优先队列扫一遍n个待选工人即可。
struct N
{
int q,w;
double rito;
}all[10005];
bool cmp(N x,N y)
{
return x.rito < y.rito ;
}
class Solution {
private:
priority_queue< int> qt;
public:
double mincostToHireWorkers(vector<int>& quality, vector<int>& wage, int K) {
int n = quality.size();
for(int i=0;i<n;i++)
{
all[i].q = quality[i];
all[i].w = wage[i];
all[i].rito = (all[i].w * 1.0) / all[i].q ;
}
sort(all,all+n,cmp);
double ans = 1e8;
int sumq =0;
for(int i=0;i<n;i++)
{
sumq +=all[i].q;
qt.push( all[i].q);
if(qt.size()>K)
{
sumq -=qt.top() ;
qt.pop();
}
if(qt.size()==K)
{
cout<<sumq<<" "<< (double) 1.0*all[i].w / all[i].q<<endl;
ans = min(ans, sumq* all[i].rito);
}
}
return ans;
}
};