C++で同じ平均を持つ分割配列
配列Aが1つあるとすると、Aのすべての要素をリストBまたはリストCのいずれかに移動する必要があります(これらのリストBとCは最初は空です)。このような移動後、平均値が可能かどうかを確認する必要があります。 Bの値はCの平均値に等しく、BとCはどちらも空ではありません。
したがって、入力が− [1,2,3,4,5,6,7,8,9,10]の場合、結果はtrueになります
これを解決するには、次の手順に従います-
- n:=Aのサイズ、合計:=0
- iを初期化する場合:=0、i
- 合計:=合計+ A [i]
- total * i mod nが0と同じ場合、-
- isPossible:=true
- falseを返す
- 初期化l:=1の場合、l <=(n / 2)の場合、更新(lを1増やします)、実行-
- dp [j、l]:=dp [j、l]またはdp [j-x、l-1]
- (total * i)mod nが0と同じで、dp [total * i / n、i]がゼロ以外の場合、-
- trueを返す
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; class Solution { public: bool splitArraySameAverage(vector<int>& A) { int n = A.size(); int total = 0 ; for(int i = 0; i < n; i++) total += A[i]; bool isPossible = false; int m = n / 2; for (int i = 1; i <= m && !isPossible; ++i) if (total*i%n == 0) isPossible = true; if (!isPossible) return false; vector < vector <bool> > dp(total + 1, vector <bool>((n / 2) + 1)); dp[0][0] = true; for(int i = 0; i < n; i++){ int x = A[i]; for(int j = total; j >= x; j--){ for(int l = 1; l <= (n / 2); l++){ dp[j][l] = dp[j][l] || dp[j - x][l - 1]; } } } for(int i = 1 ; i <= (n / 2); i++){ if((total * i) % n == 0 && dp[total * i / n][i]) return true; } return false; } }; main(){ Solution ob; vector<int> v = {1,2,3,4,5,6,7,8,9,10}; cout << (ob.splitArraySameAverage(v)); }
入力
{1,2,3,4,5,6,7,8,9,10}
出力
1
-
C++の両側に同じ数の偶数または奇数の配列インデックス
ここでは、1つの配列が与えられたと仮定して、1つの問題が発生します。 n個の要素があります。左側の偶数の頻度と右側の偶数の頻度が同じであるか、左側の奇数の頻度が右側の奇数の頻度と同じである1つのインデックスを見つける必要があります。そのような結果がない場合は、-1を返します。 配列が{4、3、2、1、2、4}のようであると仮定します。出力は2です。インデックス2の要素は2で、左側に奇数が1つだけあり、右側に奇数が1つだけあります。 この問題を解決するために、左右の情報を格納するためのペアの2つのベクトルを作成します。左側のベクトルは左側の奇数と偶数の頻度を格納し、右側のベクトルは右側でも同
-
C++での変数と実数を使用した配列の初期化
配列は、連続したメモリ位置にある同じタイプの要素のコレクションです。配列の最小アドレスは最初の要素に対応し、最大アドレスは最後の要素に対応します。配列インデックスはzero(0)で始まり、配列のサイズから1を引いたもの(配列サイズ-1)で終わります。 配列は、実数だけでなく変数でも初期化できます。これを実証するプログラムは次のとおりです。 例 #include <iostream> using namespace std; int main() { int a = 5; int b = 3; int a