# Maximum number of diamonds that can be gained in K minutes

• Difficulty Level : Easy
• Last Updated : 28 Oct, 2021

Given an array arr[] consisting of N positive integers such that arr[i] represents that the ith bag contains arr[i] diamonds and a positive integer K, the task is to find the maximum number of diamonds that can be gained in exactly K minutes if dropping a bag takes 1 minute such that if a bag with P diamonds is dropped, then it changes to [P/2] diamonds, and P diamonds are gained.

Examples:

Input: arr[] = {2, 1, 7, 4, 2}, K = 3
Output: 14
Explanation:
The initial state of bags is {2, 1, 7, 4, 2}.
Operation 1: Take all diamonds from third bag i.e., arr[2](= 7), the state of bags becomes: {2, 1, 3, 4, 2}.
Operation 2: Take all diamonds from fourth bag i.e., arr[3](= 4), the state of bags becomes: {2, 1, 3, 2, 2}.
Operation 3: Take all diamonds from Third bag i.e., arr[2](= 3), the state of bags becomes{2, 1, 1, 2, 2}.
Therefore, the total diamonds gains is 7 + 4 + 3 = 14.

Input: arr[] = {7, 1, 2}, K = 2
Output: 10

Approach: The given problem can be solved by using the Greedy Approach with the help of max-heap. Follow the steps below to solve the problem:

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach``#include ``using` `namespace` `std;` `// Function to find the maximum number``// of diamonds that can be gained in``// exactly K minutes``void` `maxDiamonds(``int` `A[], ``int` `N, ``int` `K)``{``    ``// Stores all the array elements``    ``priority_queue<``int``> pq;` `    ``// Push all the elements to the``    ``// priority queue``    ``for` `(``int` `i = 0; i < N; i++) {``        ``pq.push(A[i]);``    ``}` `    ``// Stores the required result``    ``int` `ans = 0;` `    ``// Loop while the queue is not``    ``// empty and K is positive``    ``while` `(!pq.empty() && K--) {` `        ``// Store the top element``        ``// from the pq``        ``int` `top = pq.top();` `        ``// Pop it from the pq``        ``pq.pop();` `        ``// Add it to the answer``        ``ans += top;` `        ``// Divide it by 2 and push it``        ``// back to the pq``        ``top = top / 2;``        ``pq.push(top);``    ``}` `    ``// Print the answer``    ``cout << ans;``}` `// Driver Code``int` `main()``{``    ``int` `A[] = { 2, 1, 7, 4, 2 };``    ``int` `K = 3;``    ``int` `N = ``sizeof``(A) / ``sizeof``(A[0]);``    ``maxDiamonds(A, N, K);` `    ``return` `0;``}`

## Java

 `// Java program for the above approach``import` `java.util.*;` `class` `GFG{` `// Function to find the maximum number``// of diamonds that can be gained in``// exactly K minutes``static` `void` `maxDiamonds(``int` `A[], ``int` `N, ``int` `K)``{``    ` `    ``// Stores all the array elements``    ``PriorityQueue pq = ``new` `PriorityQueue<>(``        ``(a, b) -> b - a);` `    ``// Push all the elements to the``    ``// priority queue``    ``for``(``int` `i = ``0``; i < N; i++)``    ``{``        ``pq.add(A[i]);``    ``}` `    ``// Stores the required result``    ``int` `ans = ``0``;` `    ``// Loop while the queue is not``    ``// empty and K is positive``    ``while` `(!pq.isEmpty() && K-- > ``0``)``    ``{``        ` `        ``// Store the top element``        ``// from the pq``        ``int` `top = pq.peek();` `        ``// Pop it from the pq``        ``pq.remove();` `        ``// Add it to the answer``        ``ans += top;` `        ``// Divide it by 2 and push it``        ``// back to the pq``        ``top = top / ``2``;``        ``pq.add(top);``    ``}` `    ``// Print the answer``    ``System.out.print(ans);``}` `// Driver Code``public` `static` `void` `main(String[] args)``{``    ``int` `A[] = { ``2``, ``1``, ``7``, ``4``, ``2` `};``    ``int` `K = ``3``;``    ``int` `N = A.length;``    ` `    ``maxDiamonds(A, N, K);``}``}` `// This code is contributed by 29AjayKumar`

## Python3

 `# Python3 program for the above approach` `# Function to find the maximum number``# of diamonds that can be gained in``# exactly K minutes``def` `maxDiamonds(A, N, K):``    ` `    ``# Stores all the array elements``    ``pq ``=` `[]` `    ``# Push all the elements to the``    ``# priority queue``    ``for` `i ``in` `range``(N):``        ``pq.append(A[i])``        ` `    ``pq.sort()` `    ``# Stores the required result``    ``ans ``=` `0` `    ``# Loop while the queue is not``    ``# empty and K is positive``    ``while` `(``len``(pq) > ``0` `and` `K > ``0``):``        ``pq.sort()``        ` `        ``# Store the top element``        ``# from the pq``        ``top ``=` `pq[``len``(pq) ``-` `1``]` `        ``# Pop it from the pq``        ``pq ``=` `pq[``0``:``len``(pq) ``-` `1``]` `        ``# Add it to the answer``        ``ans ``+``=` `top` `        ``# Divide it by 2 and push it``        ``# back to the pq``        ``top ``=` `top ``/``/` `2``;``        ``pq.append(top)``        ``K ``-``=` `1` `    ``# Print the answer``    ``print``(ans)` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:``    ` `    ``A ``=` `[ ``2``, ``1``, ``7``, ``4``, ``2` `]``    ``K ``=` `3``    ``N ``=` `len``(A)``    ` `    ``maxDiamonds(A, N, K)` `# This code is contributed by SURENDRA_GANGWAR`

## C#

 `// C# program for the above approach``using` `System;``using` `System.Collections;``using` `System.Collections.Generic;` `class` `GFG{` `// Function to find the maximum number``// of diamonds that can be gained in``// exactly K minutes``static` `void` `maxDiamonds(``int` `[]A, ``int` `N, ``int` `K)``{``    ` `    ``// Stores all the array elements``    ``var` `pq = ``new` `List<``int``>();` `    ``// Push all the elements to the``    ``// priority queue``    ``for``(``int` `i = 0; i < N; i++)``    ``{``        ``pq.Add(A[i]);``    ``}` `    ``// Stores the required result``    ``int` `ans = 0;` `    ``// Loop while the queue is not``    ``// empty and K is positive``    ``while` `(pq.Count!=0 && K-- > 0)``    ``{``        ``pq.Sort();``        ``// Store the top element``        ``// from the pq``        ``int` `top = pq[pq.Count-1];` `        ``// Pop it from the pq``        ``pq.RemoveAt(pq.Count-1);` `        ``// Add it to the answer``        ``ans += top;` `        ``// Divide it by 2 and push it``        ``// back to the pq``        ``top = top / 2;``        ``pq.Add(top);``    ``}` `    ``// Print the answer``    ``Console.WriteLine(ans);``}` `// Driver Code``public` `static` `void` `Main(``string``[] args)``{``    ``int` `[]A= { 2, 1, 7, 4, 2 };``    ``int` `K = 3;``    ``int` `N = A.Length;``    ` `    ``maxDiamonds(A, N, K);``}``}` `// This code is contributed by rrrtnx.`

## Javascript

 ``

Output:

`14`

Time Complexity: O((N + K)*log N)
Auxiliary Space: O(N)

My Personal Notes arrow_drop_up