最大定格部品セットを見つけるためのC++プログラム
特定の製品の特定の部品を製造しているメーカーがあるとします。メーカーにはn種類のパーツのバリエーションがあり、パーツには3つの基準で特定の評価があります。 n個の製品の評価は、配列「評価」で示されます。各要素は(A、B、C)の形式であり、A、B、およびCは製品の異なる評価基準です。現在、OEMは、部品の製造元から製品ごとにm個の部品を購入したいと考えています。 OEMは、以下の条件を満たす部品を選択します-
-
同じ部品を2つ以上購入しないでください。
-
値Vが最大になるようにパーツのセットを選択します。ここで、V=|基準Aの合計評価| +|基準Bの総合評価| +|基準Cの総合評価|。
OEMが選択した部品からVの可能な最大値を見つける必要があります。
したがって、入力がn =6、m =4、評価={{2、3、5}、{3、5、2}、{4、8、5}、{1、5、3}、 {7、2、7}、{4、3、6}}の場合、出力は56になります。
OEMがパーツ1、3、5、および6を選択した場合、各カテゴリの合計評価は-
です。Category A = 2 + 4 + 7 + 4 = 17 Category B = 3 + 8 + 2 + 3 = 16. Category C = 5 + 5 + 7 + 6 = 23 The total value of V is 17 + 16 + 23 = 56.
これを解決するには、次の手順に従います-
N := 100 Define an array arr of size: 9 x N. Define an array ans. for initialize i := 0, when i < n, update (increase i by 1), do: a := first value of ratings[i] b := second value of ratings[i] c := third value of ratings[i] arr[1, i] := a + b + c arr[2, i] := a - b - c arr[3, i] := a + b - c arr[4, i] := a - b + c arr[5, i] := -a + b + c arr[6, i] := -a - b - c arr[7, i] := -a + b - c arr[8, i] := -a - b + c for initialize i := 1, when i <= 8, update (increase i by 1), do: sort the array arr[i] for initialize i := 1, when i <= 8, update (increase i by 1), do: reverse the array arr[i] if m is the same as 0, then: V := 0 Otherwise for initialize j := 1, when j <= 8, update (increase j by 1), do: k := 0 for initialize i := 0, when i < m, update (increase i by 1), do: k := k + arr[j, i] V := maximum of V and k return V
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; const int INF = 1e9; const int modval = (int) 1e9 + 7; #define N 100 int solve(int n, int m, vector<tuple<int, int, int>> ratings) { int V, arr[9][N] ; vector<int> ans ; for(int i = 0 ; i < n ; i++) { int a, b, c; tie(a, b, c) = ratings[i]; arr[1][i] = a + b + c ; arr[2][i] = a - b - c ; arr[3][i] = a + b - c ; arr[4][i] = a - b + c ; arr[5][i] = -a + b + c ; arr[6][i] = -a - b - c ; arr[7][i] = -a + b - c ; arr[8][i] = -a - b + c ; } for(int i = 1 ; i <= 8 ; i++) sort(arr[i] , arr[i] + n) ; for(int i = 1 ; i <= 8 ; i++) reverse(arr[i] , arr[i] + n) ; if (m == 0) V = 0 ; else { for (int j = 1; j <= 8; j++) { int k = 0; for (int i = 0; i < m; i++) k += arr[j][i]; V = max(V, k); } } return V; } int main() { int n = 6, m = 4; vector<tuple<int, int, int>> ratings = {{2, 3, 5}, {3, 5, 2}, {4, 8, 5}, {1, 5, 3}, {7, 2, 7}, {4, 3, 6}}; cout<< solve(n, m, ratings); return 0; }
入力
6, 4, {{2, 3, 5}, {3, 5, 2}, {4, 8, 5}, {1, 5, 3}, {7, 2, 7}, {4, 3,6}}
出力
56
-
C++で平行四辺形の面積を見つけるプログラム
この問題では、平行四辺形の底と高さを表す2つの値が与えられます。私たちのタスクは、C++で平行四辺形の領域を見つけるプログラムを作成することです。 平行四辺形 は、反対側が等しく平行な4辺の閉じた図形です。 問題を理解するために例を見てみましょう 入力 B = 20, H = 15 出力 300 説明 平行四辺形の面積=B* H =20 * 15 =300 ソリューションアプローチ この問題を解決するために、平行四辺形の面積の幾何学的公式を使用します。 Area = base * height. ソリューションの動作を説明するプログラム 例 #include <io
-
C++でツリーの最大の深さまたは高さを見つけるプログラムを作成する
この問題では、二分木が与えられます。私たちの仕事は、与えられた木の最大の深さまたは高さを見つけるプログラムを書くことです。 問題を理解するために例を見てみましょう 木の高さは3です。 ツリーの最大の高さを見つけるために、その左右のサブツリーの高さを確認し、両方の最大値に1を追加します。これは再帰的なプロセスであり、ツリーの最後のノードが検出され、サブツリーの高さを検出するために1つが段階的に追加されます。 上記の例は、この方法を使用して解決されました。 木の高さを見つける、つまり、height(3)=max(height(5)、height(7))+1。 このために、値5