Minimum operations to make sum of neighbouring elements <= X
Last Updated :
18 Jan, 2023
Given an array arr[] of N elements and an integer X, the task is to find the minimum number of operations required to make sum of neighbouring elements less than the given number X. In a single operation, you can choose an element arr[i] and decrease its value by 1.
Examples:
Input: arr[] = {2, 2, 2}, X = 3
Output: 1
Decrement arr[1] by 1 and the array becomes {2, 1, 2}.
Now, 2 + 1 = 3 and 1 + 2 = 3
Input: arr[] = {1, 6, 1, 2, 0, 4}, X = 1
Output: 11
Approach: Suppose the elements of the array are a1, a2, …, an. Let’s assume a case when all a[i] are greater than X.
First we need to make all the a[i] equal to x. We will calculate the number of operations required for it.
Now, all elements will be of the form of x, x, x, x…, x N times. Here we can observe that the maximum neighbouring sum is equal to 2 * X.
Now, traverse the array from left to right, and for each i, if sum of two left neighbours that is a[i] + a[i – 1] > X then change a[i] to such a value that their net sum becomes equal to X.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int MinOperations( int n, int x, int * arr)
{
int total = 0;
for ( int i = 0; i < n; ++i) {
if (arr[i] > x) {
int difference = arr[i] - x;
total = total + difference;
arr[i] = x;
}
}
for ( int i = 1; i < n; ++i) {
int LeftNeigbouringSum = arr[i] + arr[i - 1];
if (LeftNeigbouringSum > x) {
int current_diff = LeftNeigbouringSum - x;
arr[i] = max(0, arr[i] - current_diff);
total = total + current_diff;
}
}
return total;
}
int main()
{
int X = 1;
int arr[] = { 1, 6, 1, 2, 0, 4 };
int N = sizeof (arr) / sizeof ( int );
cout << MinOperations(N, X, arr);
return 0;
}
|
Java
class GFG
{
static int MinOperations( int n, int x, int [] arr)
{
int total = 0 ;
for ( int i = 0 ; i < n; ++i)
{
if (arr[i] > x)
{
int difference = arr[i] - x;
total = total + difference;
arr[i] = x;
}
}
for ( int i = 1 ; i < n; ++i)
{
int LeftNeigbouringSum = arr[i] + arr[i - 1 ];
if (LeftNeigbouringSum > x)
{
int current_diff = LeftNeigbouringSum - x;
arr[i] = Math.max( 0 , arr[i] - current_diff);
total = total + current_diff;
}
}
return total;
}
public static void main(String args[])
{
int X = 1 ;
int arr[] = { 1 , 6 , 1 , 2 , 0 , 4 };
int N = arr.length;
System.out.println(MinOperations(N, X, arr));
}
}
|
Python
def MinOperations(n, x, arr):
total = 0
for i in range (n):
if (arr[i] > x):
difference = arr[i] - x
total = total + difference
arr[i] = x
for i in range (n):
LeftNeigbouringSum = arr[i] + arr[i - 1 ]
if (LeftNeigbouringSum > x):
current_diff = LeftNeigbouringSum - x
arr[i] = max ( 0 , arr[i] - current_diff)
total = total + current_diff
return total
X = 1
arr = [ 1 , 6 , 1 , 2 , 0 , 4 ]
N = len (arr)
print (MinOperations(N, X, arr))
|
C#
using System;
class GFG
{
static int MinOperations( int n, int x, int [] arr)
{
int total = 0;
for ( int i = 0; i < n; ++i)
{
if (arr[i] > x)
{
int difference = arr[i] - x;
total = total + difference;
arr[i] = x;
}
}
for ( int i = 1; i < n; ++i)
{
int LeftNeigbouringSum = arr[i] + arr[i - 1];
if (LeftNeigbouringSum > x)
{
int current_diff = LeftNeigbouringSum - x;
arr[i] = Math.Max(0, arr[i] - current_diff);
total = total + current_diff;
}
}
return total;
}
public static void Main(String []args)
{
int X = 1;
int []arr = { 1, 6, 1, 2, 0, 4 };
int N = arr.Length;
Console.WriteLine(MinOperations(N, X, arr));
}
}
|
Javascript
<script>
function MinOperations(n, x, arr)
{
let total = 0;
for (let i = 0; i < n; ++i)
{
if (arr[i] > x)
{
let difference = arr[i] - x;
total = total + difference;
arr[i] = x;
}
}
for (let i = 1; i < n; ++i)
{
let LeftNeigbouringSum = arr[i] + arr[i - 1];
if (LeftNeigbouringSum > x)
{
let current_diff = LeftNeigbouringSum - x;
arr[i] = Math.max(0, arr[i] - current_diff);
total = total + current_diff;
}
}
return total;
}
let X = 1;
let arr = [ 1, 6, 1, 2, 0, 4 ];
let N = arr.length;
document.write(MinOperations(N, X, arr)+ "<br>" );
</script>
|
Time complexity: O(N)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...