假设我们有两个长度相同的数字列表,称为性能和成本。而且我们还有另一个数字k。这些表明i的每个工作人员都在绩效[i]级别上工作,并且花费的成本至少为cost [i]。我们还必须找到雇用k名员工的最低成本,因为与该组中的其他员工相比,这些员工的薪酬将与其绩效成正比。
因此,如果输入像性能= [5,3,2]成本= [100,5,4] k = 2,那么输出将是10,因为我们可以选择emp1和emp2。必须向他们支付至少5 + 4 = 9的金额。但是emp1的性能是emp2的1.5倍,因此应该给他至少1.5 * 4 = 6的薪水。因此,总的来说,他们将得到6 + 4 = 10。
为了解决这个问题,我们将遵循以下步骤-
n:= c的大小
定义大小为n的数组序列
用值0到n-1填充seq
根据这些条件对数组seq排序(c [i] * p [j] <c [j] * p [i])
ans:= inf,psum:= 0
定义优先级队列pq
对于初始化i:= 0,当i <n时,更新(将i增加1),执行-
ans:= ans和(c [idx] / p [idx] * psum)的最小值
psum:= psum − pq的顶部元素
从pq删除top元素
idx:= seq [i]
将p [idx]插入pq
psum:= psum + p [idx]
如果pq的大小> k,则-
如果i> = k − 1,则−
返回ans
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
double solve(vector<int>& p, vector<int>& c, int k) {
int n = c.size();
vector<int> seq(n);
for (int i = 0; i < n; ++i)
seq[i] = i;
sort(seq.begin(), seq.end(), [&](int i, int j) { return c[i] *
p[j] < c[j] * p[i]; });
double ans = INT_MAX, psum = 0;
priority_queue<int> pq;
for (int i = 0; i < n; ++i) {
int idx = seq[i];
pq.emplace(p[idx]);
psum += p[idx];
if (pq.size() > k) {
psum −= pq.top();
pq.pop();
}
if (i >= k − 1)
ans = min(ans, (double)c[idx] / p[idx] * psum);
}
return ans;
}
int main(){
vector<int> performance = {5, 3, 2};
vector<int> costs = {100, 5, 4};
int k = 2;
cout << solve(performance, costs, k);
}{5, 3, 2}, {100, 5, 4}, 2输出结果10