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

C++でのパフォーマンスに基づいて従業員に支払われるべき最終的な金額を見つけるためのプログラム


パフォーマンスとコストと呼ばれる同じ長さの数値のリストが2つあるとします。また、別の数kもあります。これらは、各ワーカーiがパフォーマンス[i]レベルで実行し、少なくともコスト[i]がかかることを示しています。グループ内の他の従業員と比較して、従業員の業績に比例して支払われることも考慮して、k人の従業員を雇用するための最小コストを見つける必要があります。

したがって、入力がパフォーマンス=[5、3、2]コスト=[100、5、4] k =2のような場合、emp1とemp2を選択できるため、出力は10になります。少なくとも5+4=9の金額を支払う必要があります。ただし、emp1のパフォーマンスはemp2の1.5倍であるため、少なくとも1.5 * 4 =6を支払う必要があります。したがって、合計で6 + 4=10になります。

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

  • n:=cのサイズ

  • サイズnの配列シーケンスを定義します

  • seqに0からn-1までの値を入力します

  • これらの基準に基づいて配列seqをソートします(c [i] * p [j]

  • ans:=inf、psum:=0

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

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

    • idx:=seq [i]

    • p[idx]をpqに挿入します

    • psum:=psum + p [idx]

    • pq> kのサイズの場合、-

      • psum:=psum −pqの最上位要素

      • pqから最上位の要素を削除します

    • i> =k − 1の場合、−

      • ans:=ansの最小値と(c [idx] / p [idx] * psum)

  • 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

  1. グラフから減らすことができるスコアの最大量を見つけるためのC++プログラム

    n個の頂点とm個のエッジを持つ重み付きの無向グラフがあるとします。グラフのスコアは、グラフ内のすべてのエッジの重みの加算として定義されます。エッジの重みは負の値になる可能性があり、それらを削除するとグラフのスコアが増加します。グラフを接続したまま、グラフからエッジを削除して、グラフのスコアを最小にする必要があります。減らすことができるスコアの最大量を見つける必要があります。 グラフは配列edgesで与えられ、各要素は{weight、{vertex1、vertex2}}の形式です。 したがって、入力がn =5、m =6、edges ={{2、{1、2}}、{2、{1、3}}、{1、{2、3}

  2. グラフ行列の逆行列を見つけるためのC++プログラム

    これは、グラフ行列の逆行列を見つけるためのC++プログラムです。行列の逆行列は、行列が非特異である場合にのみ存在します。つまり、行列式は0であってはなりません。行列の逆行列は多くの方法で見つけることができます。ここでは、随伴行列とその行列式を使用して、グラフ行列の逆行列を見つけます。例に含まれる手順 Begin    function INV() to get the inverse of the matrix:    Call function DET().    Call function ADJ().