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

家づくりで最大の利益を得るためのC++コード


2つの数nとh、およびm個のトリプレットTの別の配列があるとします。ここでT [i] =(li、ri、xi)です。道路上には、家を建てることができる場所がnか所あります。スポットには1からnまでの番号が付けられています。家の高さは0からhまでです。各スポットで高さkの家を作ると、そこからk^2の金額が得られます。 mゾーンの制限があります。 i番目の制限は次のように述べています。スポットliからriまでの最も高い家は、最大でxiでなければなりません。私たちは利益を最大化するために家を作りたいと思っています。私達は私達が作ることができる最大の可能な利益を見つけなければなりません。最大の利益を見つけなければなりません。

したがって、入力がn=3のような場合。 h =3; T =[[1,1,1]、[2,2,3]、[3,3,2]]の場合、出力は14になります。これは、家が3つあるため、最大の高さが3であるためです。最初の制限は、最も高い家を1から1の間にするため、最大で1にする必要があります。 2番目の制限では、2から2の間の最も高い家で、最大で3でなければなりません。同様に、3番目の制限では、3から3の間で最も高い家で、最大で2でなければなりません。したがって、最適な高さは[1,3,2]です。したがって、1 ^ 2 + 3 ^ 2 + 2 ^ 2=14です。

ステップ

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

m := size of T
Define an array heights n and fill with h
for initialize i := 0, when i < m, update (increase i by 1), do:
   l := T[i, 0]
   r := T[i, 1]
   h := T[i, 2]
   for initialize i := l - 1, when i < r, update (increase i by 1), do:
      heights[i] := minimum of heights[i] and h
ans := 0
for initialize i := 0, when i < n, update (increase i by 1), do:
   ans := ans + heights[i] * heights[i]
return ans

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

#include <bits/stdc++.h>
using namespace std;
int solve(int n, int h, vector<vector<int>> T){
   int l, r;
   int m = T.size();
   vector<int> heights(n, h);
   for (int i = 0; i < m; i++){
      l = T[i][0];
      r = T[i][1];
      h = T[i][2];
      for (int i = l - 1; i < r; i++)
      heights[i] = min(heights[i], h);
   }
   int ans = 0;
   for (int i = 0; i < n; i++)
   ans += heights[i] * heights[i];
   return ans;
}
int main(){
   int n = 3;
   int h = 3;
   vector<vector<int>> T = { { 1, 1, 1 }, { 2, 2, 3 }, { 3, 3, 2 } };
   cout << solve(n, h, T) << endl;
}

入力

3, 3, { { 1, 1, 1 }, { 2, 2, 3 }, { 3, 3, 2 } }

出力

14

  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++でのワインの販売による最大の利益

    問題の説明 n個のワインが連続して与えられ、整数はそれぞれ各ワインのコストを示します。毎年、列の最初または最後のワインを販売できます。ワインの価格は時間とともに上昇します。ワインからの初期利益をP1、P2、P3…Pnとします。 Y年目には、i番目のワインからの利益はY*Piになります。毎年、あなたの仕事は、最初または最後のワインを販売する必要があるかどうかを示す開始または終了を印刷することです。また、すべてのワインから最大の利益を計算します。 例 If wine prices are {2, 4, 6, 2, 5} then output will be: start end end sta