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

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]
  • isPossible:=false、m:=n / 2
  • iを初期化する場合:=1、i <=mであり、isPossibleがゼロ以外の場合、更新(iを1増やします)、実行-
    • total * i mod nが0と同じ場合、-
      • isPossible:=true
  • isPossibleがゼロ以外の場合、-
    • falseを返す
  • サイズ(合計+ 1)x(n / 2)+ 1)の2D配列dpを1つ定義します
  • dp [0、0]:=true
  • iを初期化する場合:=0、i
  • x:=A [i]
  • jを初期化する場合:=合計、j> =xの場合、更新(jを1つ減らす)、実行-
    • 初期化l:=1の場合、l <=(n / 2)の場合、更新(lを1増やします)、実行-
      • dp [j、l]:=dp [j、l]またはdp [j-x、l-1]
  • iを初期化する場合:=1、i <=(n / 2)の場合、更新(iを1つ増やす)、実行-
    • (total * i)mod nが0と同じで、dp [total * i / n、i]がゼロ以外の場合、-
      • trueを返す
  • falseを返す
  • 理解を深めるために、次の実装を見てみましょう-

    #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

    1. C++の両側に同じ数の偶数または奇数の配列インデックス

      ここでは、1つの配列が与えられたと仮定して、1つの問題が発生します。 n個の要素があります。左側の偶数の頻度と右側の偶数の頻度が同じであるか、左側の奇数の頻度が右側の奇数の頻度と同じである1つのインデックスを見つける必要があります。そのような結果がない場合は、-1を返します。 配列が{4、3、2、1、2、4}のようであると仮定します。出力は2です。インデックス2の要素は2で、左側に奇数が1つだけあり、右側に奇数が1つだけあります。 この問題を解決するために、左右の情報を格納するためのペアの2つのベクトルを作成します。左側のベクトルは左側の奇数と偶数の頻度を格納し、右側のベクトルは右側でも同

    2. C++での変数と実数を使用した配列の初期化

      配列は、連続したメモリ位置にある同じタイプの要素のコレクションです。配列の最小アドレスは最初の要素に対応し、最大アドレスは最後の要素に対応します。配列インデックスはzero(0)で始まり、配列のサイズから1を引いたもの(配列サイズ-1)で終わります。 配列は、実数だけでなく変数でも初期化できます。これを実証するプログラムは次のとおりです。 例 #include <iostream> using namespace std; int main() {    int a = 5;    int b = 3;    int a