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

C++で購入者が購入できるパッケージの最大数を見つけるためのプログラム


販売と購入者の2つのリストがあるとします。 salesの各要素には、[day、price]の形式で2つの値が含まれます。これは、パッケージがその特定の価格でその日にのみ販売可能であることを示します。また、[payday、amount]の形式の購入者の各要素は、購入者が支払い日以降に使用できる金額を持っていることを示します。各購入者が最大で1つのパッケージを購入でき、各パッケージを1人だけに販売できる場合は、購入できるパッケージの最大数を見つけます。

したがって、入力がsales =[[0、5]、[0、5]、[0、6]、[1、4]、[1、5]、[3、4]]の場合、buyers =[[ 0、4]、[0、6]、[1、5]]の場合、最初の人がパッケージ[1、4]を受け取ることができるため、出力は3になります。二人目は[0、6]を取ることができます。そして最後の人はパッケージをとることができます[1、5]。

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

  • ret:=0

  • 給料日が同じ場合は、給料日に基づいてアレイの購入者を並べ替えます。金額で並べ替えます

  • セットpqを定義する

  • アレイの売上を並べ替える

  • i:=0

  • アイテムごとに販売中-

    • 一方(i <購入者と購入者のサイズ[i、0] <=it [0])、実行-

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

      • (iを1増やします)

    • j:=pqのインデックス。それを挿入します[i]intppqそしてソートします

    • jが有効なインデックスである場合、-

      • (retを1増やします)

      • pqからj番目の要素を削除します

  • retを返す

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   static bool cmp(vector<int>& a, vector<int>& b) {
      return a[0] == b[0] ? a[1] > b[1] : a[0] < b[0];
   }
   int solve(vector<vector<int>>& sales, vector<vector<int>>& buyers) {
      int ret = 0;
      sort(buyers.begin(), buyers.end());
      multiset<int> pq;
      sort(sales.begin(), sales.end(), cmp);
      int i = 0;
      for (auto& it : sales) {
         while (i < buyers.size() && buyers[i][0] <= it[0]) {
            pq.insert(buyers[i][1]);
            i++;
         }
         auto j = pq.lower_bound(it[1]);
         if (j != pq.end()) {
            ret++;
            pq.erase(j);
         }
      }
      return ret;
   }
};
int solve(vector<vector<int>>& sales, vector<vector<int>>& buyers) {
   return (new Solution())->solve(sales, buyers);
}
int main(){
   vector<vector<int>> sales = {{0, 5},{0, 5},{0, 6},{1, 4},{1, 5},{3, 4}};
   vector<vector<int>> buyers = {{0, 4},{0, 6},{1, 5}};
   cout << solve(sales, buyers);
}

入力

{{0, 5},{0, 5},{0, 6},{1, 4},{1, 5},{3, 4}}, {{0, 4},{0, 6},{1, 5}}

出力

3

  1. 車を売ることで稼ぐことができる最大の金額を見つけるためのC++プログラム

    赤と青の車の販売需要があるとします。自動車会社は、異なる価格のp個の赤い車とq個の青い車を販売することにしました。現在、同社は「a」の数の赤い車、「b」の数の青い車、および「c」の数の無色の車(車はまだ塗装されていません)を在庫しています。さまざまな車の値は配列A、B、Cで示されます。したがって、会社は1日にp + qの車を販売し、それらから最大の利益を得る必要があります。無色の車は、赤または青の任意の色で塗装できます。車を売ることで得られる最大の利益を見つけます。 したがって、入力がp =3、q =3、a =3、b =3、c =2、A ={150000、200000、200000}、B =

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

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