banner
cells

cells

为美好的世界献上 code

857. 雇用するK人の労働者の最低コスト

857. 雇佣 K 名工人的最低成本#

n 人の労働者がいます。qualitywage の 2 つの配列が与えられます。ここで、quality[i]i 番目の労働者の労働品質を表し、wage[i] は彼らの最低期待賃金です。

今、私たちは k 人の労働者を雇って賃金グループを作りたいと思っています。k 人の労働者を雇う際には、次のルールに従って賃金を支払わなければなりません。

  1. 賃金グループの各労働者について、彼らの労働品質と同じグループの他の労働者の労働品質の比率に基づいて賃金を支払います。
  2. 賃金グループの各労働者は、少なくとも彼らの最低期待賃金を受け取る必要があります。

整数 k が与えられた場合、上記の条件を満たすために必要な最小金額を返します。実際の答えは 10510^{-5} 以内の誤差で受け入れられます。

例 1:

入力: quality = [10,20,5], wage = [70,50,30], k = 2
出力: 105.00000
説明: 0番の労働者に70を支払い、2番の労働者に35を支払います。

例 2:

入力: quality = [3,1,10,10,1], wage = [4,8,2,2,7], k = 3
出力: 30.66667
説明: 0番の労働者に4を支払い、2番と3番の労働者にそれぞれ13.33333を支払います。

ヒント:

  • n==quality.length==wage.lengthn == quality.length == wage.length
  • 1<=k<=n<=1041 <= k <= n <= 10^4
  • 1<=quality[i],wage[i]<=1041 <= quality[i], wage[i] <= 10^4

優先度付きキュー#

class Solution {
public:
    double mincostToHireWorkers(vector<int> &quality, vector<int> &wage, int k) {
        int n = quality.size();
        vector<int> h(n, 0);
        iota(h.begin(), h.end(), 0);
        sort(h.begin(), h.end(), [&](const int &a, const int &b) {
            return quality[a] * wage[b] > quality[b] * wage[a];
        });
        double res = 1e9;
        double totalq = 0.0;
        priority_queue<int, vector<int>, less<int>> q;
        for (int i = 0; i < k - 1; ++i) {
            totalq += quality[h[i]];
            q.push(quality[h[i]]);
        }
        for (int i = k - 1; i < n; ++i) {
            int idx = h[i];
            totalq += quality[idx];
            q.push(quality[idx]);
            double totalc = ((double)wage[idx] / quality[idx]) * totalq;
            res = min(res, totalc);
            totalq -= q.top();
            q.pop();
        }
        return res;
    }
};
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。