C++ですべての本を購入するための最小コストを見つける
n個の要素の配列があるとします。これらはそれらの評価です。次の条件で、すべての本を購入するための最小コストを見つけます-
- 各本の費用は少なくとも1ドルになります
- 評価が隣接する本よりも高い場合、本は隣接する(左または右)よりもコストが高くなります。
したがって、たとえば、評価配列が[1、3、4、3、7、1]の場合、出力は10、As 1 + 2 + 3 + 1 + 2 + 1 =10
これを解決するには、LtoRとRtoLという2つの配列を作成し、それらを1で埋める必要があります。次に、次の手順に従います-
- 左から右にトラバースしてからLtoRを入力し、指定されたアレイの以前の評価を確認して更新します。特定のアレイの次の評価については気にしません
- 右から左にトラバースしてからRtoLを入力し、指定されたアレイの以前の評価を確認して更新します。特定のアレイの次の評価については気にしません
- 配列LtoRとRtoLの両方のi番目の位置の最大値については、結果に追加します。
例
#include<iostream> using namespace std; int getMinCost(int ratings[], int n) { int res = 0; int LtoR[n]; int RtoL[n]; for(int i = 0; i<n; i++){ LtoR[i] = RtoL[i] = 1; } for (int i = 1; i < n; i++) if (ratings[i] > ratings[i - 1]) LtoR[i] = LtoR[i - 1] + 1; for (int i = n - 2; i >= 0; i--) if (ratings[i] > ratings[i + 1]) RtoL[i] = RtoL[i + 1] + 1; for (int i = 0; i < n; i++) res += max(LtoR[i], RtoL[i]); return res; } int main() { int ratings[] = { 1, 6, 8, 3, 4, 1, 5, 7 }; int n = sizeof(ratings) / sizeof(ratings[0]); cout << "Minimum cost is: " << getMinCost(ratings, n); }
出力
Minimum cost is: 15
-
C++でツリー内のすべてのリンゴを収集するための最小時間
n個の頂点で構成される無向ツリーがあり、これらの番号が0からn-1で、頂点にいくつかのリンゴがあるとします。木の片方の端を歩くのに1秒かかります。頂点0から始まり、この頂点に戻るツリー内のすべてのリンゴを収集するために費やす必要のある最小時間を秒単位で見つける必要があります。 ここで、無向ツリーのエッジは配列のエッジで指定されます。ここで、edges [i] =[from_i、to_i]は、頂点from_iとto_iを接続するエッジが存在することを意味します。さらに、別の配列にリンゴがあります。hasApple[i] =trueは、頂点iにリンゴがあることを意味します。それ以外の場合は、リン
-
C++のフローネットワークで最小のs-tカットを見つける
次のフローネットワークがあるとします。ご存知のように、s-tカットは、ソースsノードとシンクtノードが異なるサブセットにある必要があるカットであり、ソースセットからシンク側に向かうエッジが含まれます。ここで、s-tカットの容量は、カットセット内の各エッジ容量の合計で表されます。ここでは、特定のネットワークの最小容量s-tカットを見つける必要があります。ここで期待される出力は、最小カットのすべてのエッジです。 したがって、入力が次のような場合 その場合、出力は[(1,3)、(4,3)、(4,5)]になります。 これを解決するには、次の手順に従います- ノード=6 関数bf