Максимально возможная сумма, если сделать данный массив неубывающим

Опубликовано: 1 Декабря, 2021

Для данного массива arr [] задача состоит в том, чтобы получить неубывающий массив с максимальной суммой из данного массива путем многократного уменьшения элементов массива на 1.

Объяснение:

Input: arr[] = {1, 5, 2, 3, 4}
Output: 12
Explanation: Modify the given array to {1, 2, 2, 3, 4} by reducing 5 to 2 to obtain maximum sum possible from a non-decreasing array.

Input: arr[] = {1, 2, 5, 9, -3}
Output: -15

Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.

Подход: выполните следующие действия, чтобы решить проблему:

  • Пройдите по массиву в обратном порядке.
  • Сравните каждую пару соседних элементов, чтобы проверить, не убывает ли массив, т.е. проверьте, является ли a [i - 1] ≤ a [i].
  • Если обнаружено, что это ложь, присвойте a [i - 1] = a [i] .
  • После выполнения вышеуказанных шагов p [rin t сумма измененного массива.

Ниже представлена реализация описанного выше подхода:

C ++

// C++ program for the
// above approach
#include <bits/stdc++.h>
using namespace std;
int maximumSum(vector< int > a,
int n)
{
//Traverse the array in
// reverse
for ( int i = n - 1; i >= 0; i--)
{
//If a[i] is decreasing
if (!(a[i - 1] <= a[i]))
a[i - 1] = a[i];
}
int sum = 0;
for ( int i : a) sum += i;
//Return sum of the array
sum; return
}
//Driver code
int main()
{
//Given array arr[]
vector< int > arr = {1, 5, 2, 3, 4};
int N = arr.size();
cout << (maximumSum(arr, N));
}
// This code is contributed by Mohit Kumar 29

Ява

// Java program for the
// above approach
import java.util.*;
class GFG{
static int maximumSum( int [] a,
int n)
{
//Traverse the array in
// reverse
for ( int i = n - 1 ; i > 0 ; i--)
{
//If a[i] is decreasing
if (!(a[i - 1 ] <= a[i]))
a[i - 1 ] = a[i];
}
int sum = 0 ;
for ( int i : a) sum += i;
//Return sum of the array
sum; return
}
//Driver code
public static void main(String[] args)
{
//Given array arr[]
int [] arr = { 1 , 5 , 2 , 3 , 4 };
int N = arr.length;
System.out.print(maximumSum(arr, N));
}
}
// This code is contributed by Rajput-Ji

Python3

# Python3 program for the
# above approach
def maximumSum(a, n):
# Traverse the array in reverse
for i in range (n - 1 , 0 , - 1 ):
# If a[i] is decreasing
if not a[i - 1 ] < = a[i]:
a[i - 1 ] = a[i]
# Return sum of the array
sum return (a)
# Driver Code
if __name__ = = '__main__' :
arr = [ 1 , 5 , 2 , 3 , 4 ]
N = len (arr)
print (maximumSum(arr, N))

C #

// C# program for the
// above approach
using System;
class GFG{
static int maximumSum( int [] a, int n)
{
// Traverse the array in
// reverse
for ( int i = n - 1; i > 0; i--)
{
// If a[i] is decreasing
if (!(a[i - 1] <= a[i]))
a[i - 1] = a[i];
}
int sum = 0;
foreach ( int i in a) sum += i;
// Return sum of the array
sum; return
}
// Driver code
public static void Main(String[] args)
{
// Given array []arr
int [] arr = { 1, 5, 2, 3, 4 };
int N = arr.Length;
Console.Write(maximumSum(arr, N));
}
}
// This code is contributed by shikhasingrajput
Выход:
 12

Сложность времени: O (N)
Вспомогательное пространство: O (1)