C++中最多可通过k次更新使相等的元素数量最大化


给定任务是在对数组元素最多进行k次递增后,找到可以使相等的元素数量最大化的元素个数。

让我们通过一个例子来理解我们需要做什么:

输入

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

输出

2

解释

我们可以通过将1递增三次,将3递增四次得到两个4,使得a[] = {4, 4, 8}。

输入

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

输出

0

下面程序中使用的算法如下:

  • 在main()函数中,初始化int **a[]**,**size**和**k**分别用于存储数组元素、数组大小和最大允许更新次数。

  • 在max()函数中,首先将数组按升序排序,然后声明另外两个数组int **p[size + 1]** 和 **m[size + 1]**,分别用于存储前缀和和最大值。

  • 循环从i = 0到i<= size,初始化p[i] = 0和m[i] = 0。

  • 在循环外,设置m[0] = arr[0]和p[0] = arr[0]。

  • 循环从i = 1到i<size,设置p[i] = p[i - 1] + arr[i]来计算前缀和,设置m[i] = max(m[i - 1], arr[i])来计算到该位置为止的最大值。

  • 循环结束后,初始化int Lt = 1, Rt = size, result分别用于存储左值、右值和最终答案。之后开始二分查找。

  • 使用条件(Lt < Rt)启动while循环。在循环内设置int mid = (Lt + Rt) / 2。检查是否(EleCal(p, m, mid - 1, k, size))。如果是,则设置result = mid和Lt = mid +1。

  • 否则,只需设置Rt = mid -1。

  • 循环结束后,打印result。

  • 在函数bool EleCal()中,使用条件for (int i = 0, j = x; j <= size; j++, i++)启动for循环。

  • 在循环内检查是否(x * m[j] - (p[j] - p[i]) <= k)。如果是,则返回true。循环结束后返回false。

示例

 在线演示

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

输出

2

更新于:2020年8月4日

274 次浏览

开启您的职业生涯

完成课程获得认证

开始
广告