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

C++で最大Kペアを選択するペアの配列の最大コストを見つけます


ペアAの配列があるとします。最大でKペアを選択するための最大コストを見つける必要があります。この場合、ペアタイプの要素の配列のコストは、選択されたペアの最初の要素の合計と、選択されたペアの2番目の要素の中で最小のものの積です。例として、これらのペアが選択された場合(4、8)、(10、3)、および(3、6)、コストは(4 + 10 + 3)*(3)=51、K=3の場合になります。

したがって、入力がA =[(15、5)、(65、25)、(35、20)、(20、5)、(35、20)、(15、18)、(3、8 )、(12、17)]、K =4の場合、出力は2700になります

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

  • res:=0、sum =0

  • N:=Aのサイズ

  • my_set

    と呼ばれるペアの1つのセットを定義します
  • 各ペアの2番目の値に基づいて配列Aを並べ替えます

  • 初期化i:=N --1の場合、i> =0の場合、更新(iを1つ減らす)、実行-

    • ペアを作成し(A [i]、iの最初の要素)、my_setに挿入します

    • sum:=sum + A [i]

      の最初の要素
    • my_set> Kのサイズで、実行-

      • it:=my_setの最初の要素

      • sum:=sum-最初に

      • my_setから削除します

    • res:=resの最大値と合計*A [i]

      の2番目
  • 解像度を返す

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

#include <bits/stdc++.h>
using namespace std;
bool compactor(const pair<int, int>& a,const pair<int, int>& b) {
   return (a.second < b.second);
}
int get_maximum_cost(vector<pair<int, int> > &A, int K){
   int res = 0, sum = 0;
   int N = A.size();
   set<pair<int, int>> my_set;
   sort(A.begin(), A.end(), compactor);
   for (int i = N - 1; i >= 0; --i) {
      my_set.insert(make_pair(A[i].first, i));
      sum += A[i].first;
      while (my_set.size() > K) {
         auto it = my_set.begin();
         sum -= it->first;
         my_set.erase(it);
      }
      res = max(res, sum * A[i].second);
   }
   return res;
}
int main() {
   vector<pair<int, int> > arr = {{ 15, 5}, { 65, 25}, { 35, 20}, { 20, 5}, { 35, 20}, { 15, 18}, { 3, 8 }, {12, 17}};
   int K = 4;
   cout << get_maximum_cost(arr, K);
}

入力

{{15, 5},{65, 25}, { 35, 20}, { 20, 5}, { 35, 20}, { 15, 18}, { 3, 8
}, {12, 17}}, 4

出力

2700

  1. C++の配列で最大GCDのペアを検索します

    正の整数の配列があるとします。私たちのタスクは、GCD値が最大である配列から整数のペアを見つけることです。 A ={1、2、3、4、5}とすると、出力は2になります。ペア(2、4)にはGCD 2があり、他のGCD値は2未満です。 この問題を解決するために、各要素の除数の数を格納するためのカウント配列を維持します。除数を数えるプロセスには、O(sqrt(arr [i]))の時間がかかります。全体をトラバースした後、最後のインデックスから最初のインデックスまでカウント配列をトラバースできます。要素が1より大きい値が見つかった場合、これは2つの要素の約数であり、最大GCDでもあることを意味します。

  2. グラフの最大カットを見つけるためのC++プログラム

    このプログラムでは、グラフの最大カットを見つけるために、グラフのエッジ連結性を見つける必要があります。グラフのグラフのエッジ接続は、それがブリッジであることを意味し、グラフを削除すると切断されます。接続されたコンポーネントの数は、切断された無向グラフのブリッジを削除すると増加します。 関数と擬似コード Begin    Function connections() is a recursive function to find out the connections:    A) Mark the current node un visited. &nb