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

C++でのIPO


ある会社AがIPOをすぐに開始したいとします。株式の適正価格をBに売却するために、AはIPOの前に資本を増やすためのいくつかのプロジェクトに取り組みたいと考えています。 Aのリソースは限られており、IPOの前に完了することができるのは最大でk個の個別のプロジェクトのみです。最大でk個の個別のプロジェクトを完了した後、総資本を最大化するための最良の方法を設計することにより、Aを支援できますか?

いくつかのプロジェクトがあるとします。プロジェクトiごとに、純粋な利益Piがあり、対応するプロジェクトを開始するには、Ciの最小資本が必要です。最初は、W資本があります。プロジェクトが完了すると、純粋な利益が得られ、その利益が総資本に追加されます。

要約すると、特定のプロジェクトリストから最大k個の個別のプロジェクトのリストを選択して、最終的な資本を最大化し、最終的に最大化された資本を出力します。

したがって、入力が− k =2、W =0、利益リストが[1,2,4]、資本が[0,1,1]の場合、出力は5になります。最初は資本0であるため、インデックス0でプロジェクトを開始できるため、利益1を取得できるため、資本は1になります。資本1では、インデックス1または2でプロジェクトを開始でき、インデックス2でプロジェクトを選択します。より多くの利益を得るので、最終的な答えは0 + 1 + 4=5になります。

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

  • 優先キューpqCapitalとpqMainを作成します
  • n:=利益のサイズ
  • iを初期化する場合:=0、i
  • {Profits [i]、Capital[i]}をpqCapitalに挿入
  • iを初期化する場合:=0、i
  • while(pqCapitalは空ではなく、pqCapitalの最上位要素の2番目の値<=W)、実行-
    • pqCapitalの一番上の要素をpqMainに挿入します
    • pqCapitalから要素を削除
  • pqMainが空の場合、-
    • ループから抜け出す
  • W:=W+pqMainの最上位要素の最初の値
  • pqMainから要素を削除する
  • Wを返す
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    struct Comparator{
       bool operator() (pair <int, int> a, pair <int, int> b){
          return !(a.second < b.second);
       }
    };
    class Solution {
    public:
       int findMaximizedCapital(int k, int W, vector<int>& Profits, vector<int>& Capital) {
       priority_queue < pair <int, int>, vector < pair <int, int> >, Comparator> pqCapital;
       priority_queue < pair <int ,int> > pqMain;
       int n = Profits.size();
       for(int i = 0; i < n; i++){
          pqCapital.push({Profits[i], Capital[i]});
       }
       for(int i = 0; i < k; i++){
          while(!pqCapital.empty() && pqCapital.top().second <= W){
             pqMain.push(pqCapital.top());
             pqCapital.pop();
          }
          if(pqMain.empty()) break;
             W += pqMain.top().first;
             pqMain.pop();
          }
          return W;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {1,2,4}, v1 = {0,1,1};
       cout << (ob.findMaximizedCapital(2,0, v, v1));
    }

    入力

    2
    0
    [1,2,4]
    [0,1,1]

    出力

    5

    1. C++でのリスのシミュレーション

      木、リス、そしていくつかのナッツがあります。位置は、2Dグリッドのセルで表されます。あなたの目標は、リスがすべてのナッツを集めて、それらを1つずつ木の下に置くための最小距離を見つけることです。リスは一度に最大で1つのナットしかとることができず、隣接するセルに向かって上下左右の4つの方向に移動できます。距離は移動回数で表されます。 したがって、入力が高さ:5幅:7木の位置:[2,2]リス:[4,4]ナッツ:[[3,0]、[2,5]]の場合、出力は12になります。 、 これを解決するには、次の手順に従います- 関数calc()を定義します。これには、x1、y1、x2、y2、が必要で

    2. C++の長方形エリアII

      (軸に沿った)長方形のリストがあるとします。ここで、各rectangle [i] ={x1、y1、x2、y2}です。ここで、(x1、y1)は左下隅のポイントであり、(x2、y2)は右上隅のポイントです。 i番目の長方形。 平面内のすべての長方形でカバーされる総面積を見つける必要があります。答えは非常に大きい可能性があるため、モジュロ10 ^ 9+7を使用できます。 したがって、入力が次のような場合 その場合、出力は6になります。 これを解決するには、次の手順に従います- m =10 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 r