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!



