假设我们有两个长度相同的数字列表,称为性能和成本。而且我们还有另一个数字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