Minimum operations to make sum of neighbouring elements <= X

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++
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;// Function to return the minimum// number of operations requiredint MinOperations(int n, int x, int* arr){ // To store total operations required int total = 0; for (int i = 0; i < n; ++i) { // First make all elements equal to x // which are currently greater if (arr[i] > x) { int difference = arr[i] - x; total = total + difference; arr[i] = x; } } // Left scan the array for (int i = 1; i < n; ++i) { int LeftNeigbouringSum = arr[i] + arr[i - 1]; // Update the current element such that // neighbouring sum is < x if (LeftNeigbouringSum > x) { int current_diff = LeftNeigbouringSum - x; arr[i] = max(0, arr[i] - current_diff); total = total + current_diff; } } return total;}// Driver codeint 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
// Java implementation of the approachclass GFG {// Function to return the minimum// number of operations requiredstatic int MinOperations(int n, int x, int[] arr){ // To store total operations required int total = 0; for (int i = 0; i < n; ++i) { // First make all elements equal to x // which are currently greater if (arr[i] > x) { int difference = arr[i] - x; total = total + difference; arr[i] = x; } } // Left scan the array for (int i = 1; i < n; ++i) { int LeftNeigbouringSum = arr[i] + arr[i - 1]; // Update the current element such that // neighbouring sum is < x if (LeftNeigbouringSum > x) { int current_diff = LeftNeigbouringSum - x; arr[i] = Math.max(0, arr[i] - current_diff); total = total + current_diff; } } return total;}// Driver codepublic 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));}}// This code is contributed by 29AjayKumar |
Python
# Python3 implementation of the approach# Function to return the minimum# number of operations requireddef MinOperations(n, x, arr): # To store total operations required total = 0 for i in range(n): # First make all elements equal to x # which are currently greater if (arr[i] > x): difference = arr[i] - x total = total + difference arr[i] = x # Left scan the array for i in range(n): LeftNeigbouringSum = arr[i] + arr[i - 1] # Update the current element such that # neighbouring sum is < x if (LeftNeigbouringSum > x): current_diff = LeftNeigbouringSum - x arr[i] = max(0, arr[i] - current_diff) total = total + current_diff return total# Driver codeX = 1arr=[1, 6, 1, 2, 0, 4 ]N = len(arr)print(MinOperations(N, X, arr))# This code is contributed by mohit kumar 29 |
C#
// C# implementation of the approach using System; class GFG {// Function to return the minimum// number of operations requiredstatic int MinOperations(int n, int x, int[] arr){ // To store total operations required int total = 0; for (int i = 0; i < n; ++i) { // First make all elements equal to x // which are currently greater if (arr[i] > x) { int difference = arr[i] - x; total = total + difference; arr[i] = x; } } // Left scan the array for (int i = 1; i < n; ++i) { int LeftNeigbouringSum = arr[i] + arr[i - 1]; // Update the current element such that // neighbouring sum is < x if (LeftNeigbouringSum > x) { int current_diff = LeftNeigbouringSum - x; arr[i] = Math.Max(0, arr[i] - current_diff); total = total + current_diff; } } return total;}// Driver codepublic 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));}}/* This code is contributed by PrinciRaj1992 */ |
Javascript
<script>// Javascript implementation of the approach// Function to return the minimum// number of operations requiredfunction MinOperations(n, x, arr){ // To store total operations required let total = 0; for (let i = 0; i < n; ++i) { // First make all elements equal to x // which are currently greater if (arr[i] > x) { let difference = arr[i] - x; total = total + difference; arr[i] = x; } } // Left scan the array for (let i = 1; i < n; ++i) { let LeftNeigbouringSum = arr[i] + arr[i - 1]; // Update the current element such that // neighbouring sum is < x if (LeftNeigbouringSum > x) { let current_diff = LeftNeigbouringSum - x; arr[i] = Math.max(0, arr[i] - current_diff); total = total + current_diff; } } return total;}// Driver codelet X = 1;let arr = [ 1, 6, 1, 2, 0, 4 ];let N = arr.length;document.write(MinOperations(N, X, arr)+"<br>");// This code is contributed by rag2127</script> |
11
Time complexity: O(N)
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



