题目分析
这个问题思考的几个关键点。
- 假如我们雇佣了
K
名员工,那么我们计算这K
名员工的工资需要进行如下步骤:计算每个员工的每quality
需要的wage
,即ratio[i] = wage[i] / quality[i]
。之后这K名员工的工资为,sum(max_ratio * quality[i])
。 - 由上一个计算过程可知,影响
K
名员工工资总额的因素有两个max_ratio
和sum(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;
}
};