计划根据员工在C ++中的表现来查找应支付给员工的最终金额

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

    猜你喜欢