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

Các phần tử tối đa có thể được tạo bằng nhau với k bản cập nhật trong C ++

Nhiệm vụ được đưa ra là tìm số phần tử tối đa có thể được tạo bằng nhau trong một mảng cho sau khi tăng các phần tử của nó lên tối đa k lần.

Bây giờ chúng ta hãy hiểu những gì chúng ta phải làm bằng cách sử dụng một ví dụ -

Đầu vào

a[] = {1, 3, 8}, k = 4

Đầu ra

2

Giải thích

Ở đây, chúng ta có thể nhận được hai phần bốn bằng cách tăng 1 ba lần và tăng 3 bốn lần, điều đó tạo ra một [] ={4, 4, 8}

Đầu vào

arr = {2, 5, 9}, k = 2

Đầu ra

0

Phương pháp tiếp cận được sử dụng trong chương trình dưới đây như sau

  • Trong hàm main () khởi tạo int a [], size k để lưu trữ các phần tử mảng, kích thước của mảng và các bản cập nhật tối đa có thể tương ứng.

  • Trong hàm max (), trước tiên hãy sắp xếp mảng theo thứ tự tăng dần, sau đó khai báo thêm hai mảng nữa int p [size + 1] m [size + 1] sẽ lưu trữ tổng tiền tố và giá trị lớn nhất tương ứng.

  • Lặp lại từ i =0 cho đến khi i <=size và khởi tạo p [i] =0 và m [i] =0.

  • Bên ngoài vòng lặp đặt m [0] =arr [0] và p [0] =arr [0].

  • Lặp lại từ i =1 cho đến khi i

  • Sau vòng lặp, khởi tạo int Lt =1, Rt =size, kết quả để lưu trữ giá trị bên trái, giá trị bên phải và câu trả lời cuối cùng tương ứng. Sau đó, hãy bắt đầu tìm kiếm nhị phân.

  • Bắt đầu vòng lặp while với điều kiện (Lt

  • Nếu không, chỉ cần đặt Rt =mid -1.

  • Bên ngoài kết quả in vòng lặp.

  • Trong hàm bool EleCal () khởi tạo vòng lặp for với điều kiện for (int i =0, j =x; j <=size; j ++, i ++)

  • Kiểm tra bên trong vòng lặp nếu (x * m [j] - (p [j] - p [i]) <=k). Nếu vậy, thì trả về true. Vòng lặp Outsidethe trả về false.

Ví dụ

#include <bits/stdc++.h>
using namespace std;
bool EleCal(int p[], int m[], int x, int k, int size){
   for (int i = 0, j = x; j <= size; j++, i++){
      if (x * m[j] - (p[j] - p[i]) <= k)
         return true;
   }
   return false;
}
void Max(int arr[], int size, int k){
   // sorting array in ascending order
   sort(arr, arr + size);
   int p[size + 1];
   //array for maximum value
   int m[size + 1];
   // Initialize prefix array and maximum array
   for (int i = 0; i <= size; ++i){
      p[i] = 0;
      m[i] = 0;
   }
   m[0] = arr[0];
   p[0] = arr[0];
   for (int i = 1; i < size; i++){
      // Calculating prefix sum of the array
      p[i] = p[i - 1] + arr[i];
      // Calculating max value upto that position
      // in the array
      m[i] = max(m[i - 1], arr[i]);
   }
   // Binary seach
   int Lt = 1, Rt = size, result;
   while (Lt < Rt){
      int mid = (Lt + Rt) / 2;
      if (EleCal(p, m, mid - 1, k, size)){
         result = mid;
         Lt = mid + 1;
      }
      else
         Rt = mid - 1;
   }
   //answer
   cout<<result;
}
// main function
int main(){
   int a[] = { 1, 3, 8 };
   int size = sizeof(a) / sizeof(a[0]);
   int k = 4;
   Max(a, size, k);
   return 0;
}

Đầu ra

2