Thursday, July 4, 2024
HomeData ModellingData Structure & AlgorithmMaximums from array when the maximum decrements after every access

Maximums from array when the maximum decrements after every access

Given an integer K and an array of integers arr, the task is to find the maximum element from the array and after every retrieval the number will get decremented by 1. Repeat these steps exactly K number of times and print the sum of all the values retrieved in the end.

Examples: 

Input: K = 3, arr[] = {2, 3, 5, 4} 
Output: 13 
For K = 1, current maximum is 5 (Sum = 5 and arr[] = {2, 3, 4, 4}) 
For K = 2, current maximum is 4 (Sum = 5 + 4 = 9 and arr[] = {2, 3, 3, 4}) 
For K = 3, current maximum is 4 (Sum = 9 + 4 = 13 and arr[] = {2, 3, 3, 3}) 
Hence, the result is 13

Input: K = 4, arr[] = {1, 2, 4} 
Output: 11 

Approach: The main idea is to use a max heap which will have the maximum element at it’s root at any instance of time. 

  • Create a max heap of all the elements of the array.
  • Get the root element of the heap and add it to the sum.
  • Pop the root element and decrement it by 1 then insert it again into the heap.
  • Repeat the above two steps exactly K number of times.
  • Print the total sum in the end.

Below is the implementation of the above approach:  

C++




// C++ implementation of above approach
#include <bits/stdc++.h>
using namespace std;
#define ll long long
 
ll getSum(int arr[], int K, int n)
{
    ll sum = 0;
    priority_queue<ll> maxHeap;
    for (ll i = 0; i < n; i++) {
 
        // put all array elements
        // in a max heap
        maxHeap.push(arr[i]);
    }
 
    while (K--) {
 
        // Get the current maximum element
        ll currentMax = maxHeap.top();
 
        // Add it to the sum
        sum += currentMax;
 
        // Remove the current max from the heap
        maxHeap.pop();
 
        // Add the current max back to the
        // heap after decrementing it by 1
        maxHeap.push(currentMax - 1);
    }
    return sum;
}
 
// driver code
int main()
{
    int arr[] = { 2, 3, 5, 4 }, K = 3;
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << getSum(arr, K, n) << endl;
}


Java




// Java implementation of above approach
import java.util.*;
class Solution
{
 
static int getSum(int arr[], int K, int n)
{
    int sum = 0;
    PriorityQueue<Integer> maxHeap =
                          new PriorityQueue<Integer>(n,Collections.reverseOrder());
    for (int i = 0; i < n; i++) {
 
        // put all array elements
        // in a max heap
        maxHeap.add(arr[i]);
    }
 
    while (K-->0) {
 
        // Get the current maximum element
        int currentMax = (int)maxHeap.peek();
 
        // Add it to the sum
        sum += currentMax;
 
        // Remove the current max from the heap
        maxHeap.remove();
 
        // Add the current max back to the
        // heap after decrementing it by 1
        maxHeap.add(currentMax - 1);
    }
    return sum;
}
 
// driver code
public static void main(String args[])
{
    int arr[] = { 2, 3, 5, 4 }, K = 3;
    int n =arr.length;
    System.out.println(getSum(arr, K, n));
}
}
//contributed by Arnab Kundu


Python3




# Python3 implementation of above approach
# importing the heapq module
import heapq
# function to get maximum sum
 
 
def getSum(arr, K, n):
    Sum = 0
    maxHeap = arr
    # creating a maxheap
    heapq._heapify_max(maxHeap)
    while (K > 0):
        # Get the current maximum element
        currentMax = maxHeap[0]
        # Add it to the sum
        Sum += currentMax
        # decrementing the root of the max heap by 1
        maxHeap[0] -= 1
        # maintaining the heap property
        # as we have reduced the value of root by 1
        # so it may distort the heap property
        heapq._heapify_max(maxHeap)
        K -= 1
    return Sum
 
 
# Driver code
arr = [2, 3, 5, 4]
K = 3
n = len(arr)
print(getSum(arr, K, n))
 
'''This code is contributed by Rajat Kumar'''


C#




// C# implementation of above approach
using System;
using System.Collections.Generic;
class GFG {
  
    static int getSum(int[] arr, int K, int n)
    {
        int sum = 0;
        List<int> maxHeap = new List<int>();
        for (int i = 0; i < n; i++) {
       
            // put all array elements
            // in a max heap
            maxHeap.Add(arr[i]);
        }
         
        maxHeap.Sort();
        maxHeap.Reverse();
         
        while (K-- > 0) {
       
            // Get the current maximum element
            int currentMax = maxHeap[0];
       
            // Add it to the sum
            sum += currentMax;
       
            // Remove the current max from the heap
            maxHeap.RemoveAt(0);
       
            // Add the current max back to the
            // heap after decrementing it by 1
            maxHeap.Add(currentMax - 1);
            maxHeap.Sort();
            maxHeap.Reverse();
        }
        return sum;
    
     
  // Driver code
  static void Main()
  {
    int[] arr = { 2, 3, 5, 4 };
    int K = 3;
    int n = arr.Length;
    Console.Write(getSum(arr, K, n));
  }
}
 
// This code is contributed by divyesh072019.


Javascript




<script>
    // Javascript implementation of above approach
     
    function getSum(arr, K, n)
    {
        let sum = 0;
        let maxHeap = [];
        for (let i = 0; i < n; i++) {
        
            // put all array elements
            // in a max heap
            maxHeap.push(arr[i]);
        }
          
        maxHeap.sort(function(a, b){return a - b});
        maxHeap.reverse();
          
        while (K-- > 0) {
        
            // Get the current maximum element
            let currentMax = maxHeap[0];
        
            // Add it to the sum
            sum += currentMax;
        
            // Remove the current max from the heap
            maxHeap.shift();
        
            // Add the current max back to the
            // heap after decrementing it by 1
            maxHeap.push(currentMax - 1);
            maxHeap.sort(function(a, b){return a - b});
            maxHeap.reverse();
        }
        return sum;
    }
     
    // Driver code
    let arr = [ 2, 3, 5, 4 ];
    let K = 3;
    let n = arr.length;
    document.write(getSum(arr, K, n));
     
    // This code is contributed by suresh07.
</script>


Output: 

13

 

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Dominic Rubhabha Wardslaus
Dominic Rubhabha Wardslaushttps://neveropen.dev
infosec,malicious & dos attacks generator, boot rom exploit philanthropist , wild hacker , game developer,
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments