贪心
1.k名工人 整体工资与整体工作质量存在一个比值m,这个比值m 乘以每名工人的工作质量得到实际工资
2.所以,当k名工人整体工资最低时,首先要求这个比值m 要是k名工人中 最低工资/工作质量 的比值最小的那个。(既保证整体工资低,又保证实际工资都不低于最低工资)
3.在得到最低的比值m 后,在去找可能的最小的工作质量的和。构成一个组合(两者乘积就是整体工资)。在所有的组合中找一个最小的乘积。
class Solution {
public:
double mincostToHireWorkers(vector<int>& quality, vector<int>& wage, int K) {
vector<pair<double,int>> radio;
for(int i=0;i<wage.size();i++){
radio.push_back({wage[i]*1.0/quality[i],i});
}
sort(radio.begin(),radio.end());
priority_queue<double> qu;
double ans=1e9,sum=0;
for(int i=0;i<radio.size();i++){
qu.push(quality[radio[i].second]);
sum+=quality[radio[i].second];
if(qu.size()>K){
sum-=qu.top();
qu.pop();
}
if(qu.size()==K) ans=min(ans,sum*radio[i].first);
}
return ans;
}
};