C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でのチームの最大パフォーマンス


エンジニアがn人いるとします。それらには1からnまでの番号が付けられ、速度と効率の2つの配列もあります。ここでspeed[i]とefficiency[i]は、i番目のエンジニアの速度と効率を表します。最大でk人のエンジニアで構成されるチームの最大のパフォーマンスを見つける必要があります。答えは非常に大きい可能性があるため、10 ^ 9+7を法として返します。

ここで、チームのパフォーマンスは、エンジニアの速度の合計にエンジニア間の最小効率を掛けたものです。

したがって、入力がn =6、速度=[1,5,8,2,10,3]、効率=[9,7,2,5,4,3]、k =2の場合、出力は速度10と効率4のエンジニアと、速度5と効率7のエンジニアを選択することで、チームの最大パフォーマンスが得られるため、60になります。つまり、パフォーマンス=(10 + 5)* min(4、7)=60 。

これを解決するには、次の手順に従います-

  • ret:=0

  • 1つの2Dアレイvを定義する

  • 初期化i:=0の場合、i

    • vの最後に{e[i]、s[i]}を挿入します

  • 配列vを逆の順序で並べ替えます

  • 1つの優先キューpqを定義する

  • 合計:=0

  • 初期化i:=0の場合、i

    • pqのサイズがkと同じ場合、-

      • sum:=sumの最上位要素-pq

      • pqから要素を削除する

    • 合計:=合計+ v [i、1]

    • v [i、1]をpqに挿入します

    • ret:=retと合計の最大値*v [i、0]

  • return ret mod(1 ^ 9 + 7)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int maxPerformance(int n, vector<int>& s, vector<int>& e, int k){
      long long int ret = 0;
      vector<vector<int> > v;
      for (int i = 0; i < n; i++) {
         v.push_back({ e[i], s[i] });
      }
      sort(v.rbegin(), v.rend());
      priority_queue<int, vector<int>, greater<int> > pq;
      long long int sum = 0;
      for (int i = 0; i < n; i++) {
         if (pq.size() == k) {
            sum -= pq.top();
            pq.pop();
         }
         sum += v[i][1];
         pq.push(v[i][1]);
         ret = max(ret, sum * v[i][0]);
      }
      return ret % (long long int)(1e9 + 7);
   }
};
main(){
   Solution ob;
   vector<int> v = {1,5,8,2,10,3};
   vector<int> v1 = {9,7,2,5,4,3};
   cout << (ob.maxPerformance(6,v,v1,2));
}

入力

6, {1,5,8,2,10,3}, {9,7,2,5,4,3}, 2

出力

60

  1. C++でのジョブスケジューリングの最大利益

    n個の異なるタスクがあり、すべてのタスクがstartTime[i]からendTime[i]まで実行されるようにスケジュールされていると仮定します。そのタスクでは、利益[i]を得ることができます。 startTime、endTime、および利益のリストがわかっているので、時間範囲が重複するサブセットに2つのタスクがないように、取得できる最大の利益を見つける必要があります。時間Xで終了するタスクを選択すると、時間Xで開始する別のタスクを開始できます。 したがって、入力がstartTime =[1,2,3,3]の場合、endTime=[3,4,5,6]利益=[500,100,400,700]

  2. C++でのペアの最大長チェーン

    ペアのチェーンが与えられています。各ペアには2つの整数があり、最初の整数は常に小さく、2番目の整数は大きいので、同じルールをチェーンの構築にも適用できます。ペア(x、y)は、q