Find the Maximum possible Sum for the given conditions

Given an array arr[] of size N, the task is to find the maximum possible sum of the array by following the given conditions:

  • At every step, only one element can be used to increase the sum.
  • If some element K is selected from the array, the remaining numbers in the array get reduced by one.
  • The elements in the array can’t be reduced past 0.

Examples:

Input: arr = {6, 6, 6}
Output: 15
Explanation:
Initially, the total sum is 0. Since all the elements are equal, any one element is chosen.
Sum after choosing the first six = 6. Remaining elements = {5, 5}.
Sum after choosing the five = 11. Remaining elements = {4}.
Finally, four is chosen making the maximum sum 15.

Input: arr = {0, 1, 0}
Output: 1
Explanation:
Initially, the total sum is 0. There is only one number that can be chosen in the array because rest of the elements are 0.
Therefore, the maximum sum = 1.

Approach: Since the value of all the other elements gets reduced by 1, clearly, we get the maximum sum if we choose the maximum element at every iteration. Therefore, in order to do this, sorting is used.



  • The idea is to sort the elements of the array in descending order.
  • Now, since we get to choose the maximum value at every iteration, we calculate the value of the element K at some index ‘i’ as (K – i).
  • If at any index the value of the element becomes 0, then all the elements past that index will be 0.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the maximum 
// possible Sum for the given conditions
#include<bits/stdc++.h>
using namespace std;
  
// Function to find the maximum 
// possible sum for the 
// given conditions
int maxProfit(int arr[], int n)
      
    // Sorting the array
    sort(arr, arr + n, greater<int>());
  
    // Variable to store the answer
    int ans = 0;
  
    // Iterating through the array
    for(int i = 0; i < n; i++)
    {
         
       // If the value is greater than 0
       if ((arr[i] - (1 * i)) > 0)
           ans += (arr[i] - (1 * i));
         
       // If the value becomes 0 
       // then break the loop because 
       // all the weights after this 
       // index will be 0
       if ((arr[i] - (1 * i)) == 0)
           break;
    }
      
    // Print profit
    return ans;
}
  
// Driver code
int main()
{
    int arr[] = {6, 6, 6};
    int n = sizeof(arr) / sizeof(arr[0]);
      
    cout << maxProfit(arr, n);
    return 0;
}
  
// This code is contributed by ankitkumar34

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the maximum 
// possible Sum for the given conditions 
import java.util.Arrays; 
import java.util.Collections; 
  
public class GFG{
  
    // Function to find the maximum 
    // possible sum for the 
    // given conditions 
    static int maxProfit(Integer [] arr)
    
          
        // Sorting the array 
        Arrays.sort(arr, Collections.reverseOrder());
      
        // Variable to store the answer 
        int ans = 0;
      
        // Iterating through the array 
        for(int i = 0; i < arr.length; i++)
        {
      
           // If the value is greater than 0 
           if ((arr[i] - (1 * i)) > 0)
               ans += (arr[i] - (1 * i));
      
           // If the value becomes 0 
           // then break the loop because 
           // all the weights after this 
           // index will be 0 
           if ((arr[i] - (1 * i)) == 0
               break;
        }
          
        // Print profit 
        return ans;
    }
      
// Driver code 
public static void main(String[] args)
{
    Integer arr[] = { 6, 6, 6 };
    System.out.println(maxProfit(arr));
}
}
  
// This code is contributed by AnkitRai01

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find the maximum 
# possible Sum for the given conditions
  
# Function to find the maximum 
# possible sum for the 
# given conditions
def maxProfit(arr):
      
    # Sorting the array
    arr.sort(reverse = True)
  
    # Variable to store the answer
    ans = 0
  
    # Iterating through the array
    for i in range(len(arr)):
  
        # If the value is greater than 0
        if (arr[i]-(1 * i))>0:
            ans+=(arr[i]-(1 * i))
  
        # If the value becomes 0 
        # then break the loop because 
        # all the weights after this 
        # index will be 0
        if (arr[i]-(1 * i))== 0:
            break
  
    # print profit
    return ans    
  
# Driver code
if __name__ == "__main__":
   
    arr = [6, 6, 6]
  
    print(maxProfit(arr))
   

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find the maximum 
// possible Sum for the given conditions 
using System;
  
class GFG{
  
// Function to find the maximum 
// possible sum for the 
// given conditions 
static int maxProfit(int[] arr)
          
    // Sorting the array 
    Array.Sort(arr);
    Array.Reverse(arr);
      
    // Variable to store the answer 
    int ans = 0;
      
    // Iterating through the array 
    for(int i = 0; i < arr.Length; i++)
    {
         
       // If the value is greater than 0 
       if ((arr[i] - (1 * i)) > 0)
           ans += (arr[i] - (1 * i));
         
       // If the value becomes 0 
       // then break the loop because 
       // all the weights after this 
       // index will be 0 
       if ((arr[i] - (1 * i)) == 0) 
           break;
    }
          
    // Print profit 
    return ans;
}
      
// Driver code 
static public void Main ()
{
    int[] arr = { 6, 6, 6 };
      
    Console.Write(maxProfit(arr));
}
}
  
// This code is contributed by Shubhamsingh10

chevron_right


Output:

15

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.