Given an array arr[] of size N, the task is to find the maximum value that can be obtained by following the below conditions:
- Select any element (say k) from the array and increase all other elements by 1.
- In the next step, jump only to the index with a value k+1.
- In the end, you are at the maximum value.
Examples:
Input: N = 4, arr[] ={1, 2, 1, 3}
Output: 3
Explanation: If started from index 0 with a height of 1 unit, then,
the new value of array will be [1, 3, 2, 4].
Then jump to the index with (1+1 = 2) ie 2nd index,
The updated values are [2, 4, 2, 5]. Cannot be at the maximum value at end
The first chosen value was 3 at index 3.
The updated values are [2, 3, 2, 3]. Max achieved -3. Hence ans = 3;Input: N = 4, arr[]={1, 2, 3, 3}
Output: 4
Approach: The problem can be solved based on the following observation:
On observation, we can realize that for reaching maximum height we have two options
- Directly selecting the maximum heighted podium initially available.
- Choosing all the elements (say total y) with same value (say x). So highest number that can be reached is (x + y – 1).
Follow the below steps to solve the problem:
- Sort the array in increasing order.
- Seek for the span of the same value elements and get the maximum value that can be achieved from that span using the above idea.
- Perform this for all available spans and store the maximum.
- Return the maximum as the required answer.
Below is the implementation of the above approach.
// C++ code to implement the approach #include <bits/stdc++.h> using namespace std;
// Function to find the largest value int maxVal( int n, int a[])
{ // Sort to get highest span and
// maximum initial value
sort(a, a + n);
int ans = 0, span = 0;
for ( int i = 1; i < n; i++) {
// Increase the span if they are same
if (a[i - 1] == a[i]) {
span++;
}
else {
// ans updation if
// new value is bigger
ans = max(ans, a[i - 1] + span);
span = 0;
}
}
ans = max(ans, a[n - 1] + span);
ans = max(ans, a[n - 1]);
// Checking max of new ans
// and initial maximum
return ans;
} // Driver Code int main()
{ int N = 4;
int arr[] = { 1, 2, 1, 3 };
// Function call
cout << maxVal(N, arr) << endl;
return 0;
} |
// Java code to implement the approach import java.io.*;
import java.util.*;
class GFG
{ // Function to find the largest value
public static int maxVal( int n, int a[])
{
// Sort to get highest span and
// maximum initial value
Arrays.sort(a);
int ans = 0 , span = 0 ;
for ( int i = 1 ; i < n; i++) {
// Increase the span if they are same
if (a[i - 1 ] == a[i]) {
span++;
}
else {
// ans updation if
// new value is bigger
ans = Math.max(ans, a[i - 1 ] + span);
span = 0 ;
}
}
ans = Math.max(ans, a[n - 1 ] + span);
ans = Math.max(ans, a[n - 1 ]);
// Checking max of new ans
// and initial maximum
return ans;
}
// Driver Code
public static void main(String[] args)
{
int N = 4 ;
int arr[] = { 1 , 2 , 1 , 3 };
// Function call
System.out.println(maxVal(N, arr));
}
} // This code is contributed by Rohit Pradhan |
# Python code to implement the approach # Function to find the largest value def maxVal(n, a):
# Sort to get highest span and
# maximum initial value
a.sort()
ans = 0
span = 0
for i in range ( 1 , n):
# Increase the span if they are same
if (a[i - 1 ] = = a[i]):
span + = 1
else :
# ans updation if
# new value is bigger
ans = max (ans, a[i - 1 ] + span)
span = 0
ans = max (ans, a[n - 1 ] + span)
ans = max (ans, a[n - 1 ])
# Checking max of new ans
# and initial maximum
return ans
# Driver Code N = 4
arr = [ 1 , 2 , 1 , 3 ]
# Function call print (maxVal(N, arr))
# This code is contributed by gfgking. |
// C# program to implement // the above approach using System;
class GFG
{ // Function to find the largest value
public static int maxVal( int n, int [] a)
{
// Sort to get highest span and
// maximum initial value
Array.Sort(a);
int ans = 0, span = 0;
for ( int i = 1; i < n; i++) {
// Increase the span if they are same
if (a[i - 1] == a[i]) {
span++;
}
else {
// ans updation if
// new value is bigger
ans = Math.Max(ans, a[i - 1] + span);
span = 0;
}
}
ans = Math.Max(ans, a[n - 1] + span);
ans = Math.Max(ans, a[n - 1]);
// Checking max of new ans
// and initial maximum
return ans;
}
// Driver Code
public static void Main()
{
int N = 4;
int [] arr = { 1, 2, 1, 3 };
// Function call
Console.Write(maxVal(N, arr));
}
} // This code is contributed by shinjanpatra |
<script> // JavaScript code to implement the approach // Function to find the largest value function maxVal(n, a)
{ // Sort to get highest span and
// maximum initial value
a.sort();
let ans = 0, span = 0;
for (let i = 1; i < n; i++) {
// Increase the span if they are same
if (a[i - 1] == a[i]) {
span++;
}
else {
// ans updation if
// new value is bigger
ans = Math.max(ans, a[i - 1] + span);
span = 0;
}
}
ans = Math.max(ans, a[n - 1] + span);
ans = Math.max(ans, a[n - 1]);
// Checking max of new ans
// and initial maximum
return ans;
} // Driver Code let N = 4; let arr = [ 1, 2, 1, 3 ]; // Function call document.write(maxVal(N, arr), "</br>" );
// This code is contributed by shinjanpatra </script> |
3
Time Complexity: O(N*logN)
Auxiliary Space: O(1)