Computer >> Máy Tính >  >> Lập trình >> C ++

Chia mảng với cùng mức trung bình trong C ++

Giả sử chúng ta có một mảng A, chúng ta phải chuyển mọi phần tử của A sang danh sách B hoặc danh sách C. (Những danh sách B và C này ban đầu trống.) Chúng ta phải kiểm tra xem sau khi di chuyển như vậy, giá trị trung bình có thể không. của B bằng giá trị trung bình của C và B và C đều không trống.

Vì vậy, nếu đầu vào là - [1,2,3,4,5,6,7,8,9,10], thì kết quả sẽ là true,

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • n:=kích thước của A, tổng:=0
  • để khởi tạo i:=0, khi i
  • tổng số:=tổng số + A [i]
  • isPossible:=false, m:=n / 2
  • để khởi tạo i:=1, khi i <=m và không phải là Không thể là khác 0, hãy cập nhật (tăng i lên 1), thực hiện -
    • nếu tổng số * i mod n bằng 0, thì -
      • isPossible:=true
  • nếu không là Không thể là khác 0, thì -
    • trả về false
  • Xác định một dp mảng 2D có kích thước (tổng + 1) x (n / 2) + 1)
  • dp [0, 0]:=true
  • để khởi tạo i:=0, khi i
  • x:=A [i]
  • để khởi tạo j:=total, khi j> =x, cập nhật (giảm j đi 1), thực hiện -
    • để khởi tạo l:=1, khi l <=(n / 2), cập nhật (tăng l lên 1), thực hiện -
      • dp [j, l]:=dp [j, l] HOẶC dp [j - x, l - 1]
  • để khởi tạo i:=1, khi i <=(n / 2), cập nhật (tăng i lên 1), thực hiện -
    • nếu (tổng * i) mod n giống 0 và dp [tổng * i / n, i] khác 0, thì -
      • trả về true
  • trả về false
  • Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

    Ví dụ

    #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));
    }

    Đầu vào

    {1,2,3,4,5,6,7,8,9,10}

    Đầu ra

    1