雇用C ++的K工人的最低成本

假设有N个工人。每个工人都有质量参数。第i个工人具有质量[i]和最低工资期望工资[i]。现在,我们想雇用K个工人组成一个有薪小组。当我们雇用一组K工人时,我们必须根据以下规则向他们付款-

  • 通过与付费组中的其他人员进行比较,应按照付费组中每个人的质量比例向其支付工资。

  • 带薪组中的每个工人都必须至少获得其最低工资预期。

我们必须找到组成满足上述条件的付费小组所需的最少资金。

因此,如果输入像质量= [10,22,5],工资= [70,52,30]且K = 2,则输出将为105.000。这是因为我们将向第一名工人支付70,第三名工人支付35。

为了解决这个问题,我们将遵循以下步骤-

  • 用q,w和r定义数据

  • n:=质量的大小

  • 制作大小为n的数据v的数组

  • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

    • v [i]的q:=质量[i]

    • v [i]的w:=工资[i]

    • v [i]的r:= v [i]的w / v [i]的q

  • 根据r值对数组v排序

  • 温度:= 0

  • 和:= 0

  • ans:= inf

  • 定义一个优先级队列pq

  • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

    • ans:=(v [i]的和(sum * r)+ v [i]的w和ans的最小值

    • x:= pq的顶部元素

    • 总和:=总和-x

    • 从pq中删除元素

    • 如果pq的大小与k相同,则-

    • 如果pq的大小与k-1相同,则-

    • 总和:=总和+ v [i]的q

    • 将v [i]的q插入pq

    • 返回ans

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    struct Data {
       double q, w, r;
    };
    class Solution {
       public:
       static bool cmp(Data a, Data b) { return a.r < b.r; }
       double mincostToHireWorkers(vector<int> &quality, vector<int>
       &wage, int k) {
          int n = quality.size();
          vector<Data> v(n);
          for (int i = 0; i < n; i++) {
             v[i].q = quality[i];
             v[i].w = wage[i];
             v[i].r = v[i].w / v[i].q;
          }
          sort(v.begin(), v.end(), cmp);
          double temp = 0;
          double sum = 0;
          double ans = INT_MAX;
          priority_queue<int> pq;
          for (int i = 0; i < n; i++) {
             if (pq.size() == k) {
                double x = pq.top();
                sum -= x;
                pq.pop();
             }
             if (pq.size() == k - 1) {
                ans = min((sum * v[i].r) + v[i].w, ans);
             }
             sum += v[i].q;
             pq.push(v[i].q);
          }
          return ans;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {10,22,5}, v1 = {70,52,30};
       cout << (ob.mincostToHireWorkers(v, v1, 2));
    }

    输入值

    {10,22,5}
    {70,52,30}
    2

    输出结果

    105