C++ 中,当每次访问数组最大值都会递减时,如何从数组中找出最大值

c++server side programmingprogramming

在这个问题中,给定一个数组 arr[] 和一个整数 M。我们的任务是编写一个程序,在 C++ 中,当每次访问数组最大值都会递减时,如何从数组中找出最大值。

问题描述

为了找出最大值,我们需要从数组中找出最大元素,并在每次检索后将其减 1,执行 M 次。

让我们举个例子来理解这个问题:

输入:arr[] = {3, 6, 8, 9} M = 2

输出:17

解释

第一次迭代,最大值 = 9,总和 = 9,更新后的 arr = {3, 6, 8, 8

第二次迭代,最大值 = 8,总和 = 9+8 = 17,更新后的数组 = {3, 6, 7, 8}

解决方案

一个简单的解决方案是使用最大堆,其根元素为最大元素。然后弹出根元素,将其减 1,然后再次插入该元素。弹出和插入操作共执行 M 次。对于每次弹出操作,我们将该元素添加到总和元素中,并在 M 次迭代后打印总和。

示例

#include <bits/stdc++.h>
using namespace std;
int getSum(int arr[], int N, int M) {
   int sumVal = 0;
   priority_queue<int> heap;
   for (int i = 0; i < N; i++)
      heap.push(arr[i]);
   while (M--) {
      int maximumVal = heap.top();
      sumVal += maximumVal;
      heap.pop();
      heap.push(maximumVal - 1);
   }
   return sumVal;
}
int main() {
   int arr[] = { 3, 6, 8, 9};
   int M = 2;
   int N = sizeof(arr) / sizeof(arr[0]);
   cout<<"每次访问后最大值递减时数组中的最大值为 "<<getSum(arr, N,M);
}

输出

每次访问后最大值递减时数组中的最大值为 17

相关文章