Given an array **arr[]** of **N** elements, you have to perform the following operation on the given array until the array is reduced to a single elements,

- Choose two indices
**i**and**j**such that**i != j**. - Replace
**arr[i]**with**arr[i] – arr[j]**and remove**arr[j]**from the array.

The task is to maximize and print the value of the last remaining element of the array.

**Examples:**

Input:arr[] = {20, 3, -15, 7}

Output:45

Step 1: We can remove 7 and replace -15 with -22.

step 2: We can remove 3 and replace -22 with -25.

step 3: We can remove -25 and replace 20 with 45.

So 45 is the maximum value that we can get.

Input:arr[] = {5, 4, 6, 2}

Output:13

**Approach:** In order to maximize the value of the last remaining element, there are three cases:

**Array has negative as well as positive numbers:**First we will subtract all positive numbers (except one) from negative numbers. After this, we will only be left with a single positive and a single negative number. Now, we will subtract that negative number from the positive one which will yield a positive number at last as a result. So, in this case, the result is the sum of absolute values of the array elements.**Array contains only positive numbers:**First we find the smallest number and then subtract all positive numbers from it except one positive number. After this we get just one positive number and one negative number, now we will subtract the negative number from that positive one which will yield a positive number at last as a result. Here we can observe that the smallest

number has vanished and also the value is basically cut out from next greater element which is different from case 1. So, in this case the result is the sum of absolute values of array elements – 2 * minimum element.**Array contains only negative numbers:**First we find the largest number and then subtract all negative number from it except one negative number. After this we get just one negative number and one positive number, now we will subtract the negative number from that positive one which will yield a positive number at last as a result. Here we can observe that the largest number has vanished and also the value is basically cut out from next greater element which is different from case 1. So in this case the result is the sum of the absolute values of array elements – 2 * absolute of largest element. Here we take largest as absolute of largest is smallest in case of negative number.

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 maximized value ` `int` `find_maximum_value(` `int` `a[], ` `int` `n) ` `{ ` ` ` `int` `sum = 0; ` ` ` `int` `minimum = INT_MAX; ` ` ` `int` `pos = 0, neg = 0; ` ` ` ` ` `for` `(` `int` `i = 0; i < n; i++) { ` ` ` ` ` `// Overall minimum absolute value ` ` ` `// of some element from the array ` ` ` `minimum = min(minimum, ` `abs` `(a[i])); ` ` ` ` ` `// Add all absolute values ` ` ` `sum += ` `abs` `(a[i]); ` ` ` ` ` `// Count positive and negative elements ` ` ` `if` `(a[i] >= 0) ` ` ` `pos += 1; ` ` ` `else` ` ` `neg += 1; ` ` ` `} ` ` ` ` ` `// Both positive and negative ` ` ` `// values are present ` ` ` `if` `(pos > 0 && neg > 0) ` ` ` `return` `sum; ` ` ` ` ` `// Only positive or negative ` ` ` `// values are present ` ` ` `return` `(sum - 2 * minimum); ` `} ` ` ` `// Driver code ` `int` `main() ` `{ ` ` ` `int` `a[] = { 5, 4, 6, 2 }; ` ` ` `int` `n = ` `sizeof` `(a) / ` `sizeof` `(a[0]); ` ` ` ` ` `cout << find_maximum_value(a, n); ` ` ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

## Java

`// Java implementation of the approach ` `import` `java.io.*; ` ` ` `class` `GFG ` `{ ` ` ` ` ` `// Function to return the maximized value ` ` ` `static` `int` `find_maximum_value(` `int` `a[], ` `int` `n) ` ` ` `{ ` ` ` `int` `sum = ` `0` `; ` ` ` `int` `minimum = Integer.MAX_VALUE; ` ` ` `int` `pos = ` `0` `, neg = ` `0` `; ` ` ` ` ` `for` `(` `int` `i = ` `0` `; i < n; i++) ` ` ` `{ ` ` ` ` ` `// Overall minimum absolute value ` ` ` `// of some element from the array ` ` ` `minimum = Math.min(minimum, Math.abs(a[i])); ` ` ` ` ` `// Add all absolute values ` ` ` `sum += Math.abs(a[i]); ` ` ` ` ` `// Count positive and negative elements ` ` ` `if` `(a[i] >= ` `0` `) ` ` ` `pos += ` `1` `; ` ` ` `else` ` ` `neg += ` `1` `; ` ` ` `} ` ` ` ` ` `// Both positive and negative ` ` ` `// values are present ` ` ` `if` `(pos > ` `0` `&& neg > ` `0` `) ` ` ` `return` `sum; ` ` ` ` ` `// Only positive or negative ` ` ` `// values are present ` ` ` `return` `(sum - ` `2` `* minimum); ` ` ` `} ` ` ` ` ` `// Driver code ` ` ` `public` `static` `void` `main (String[] args) ` ` ` `{ ` ` ` ` ` `int` `[]a = { ` `5` `, ` `4` `, ` `6` `, ` `2` `}; ` ` ` `int` `n = a.length; ` ` ` ` ` `System.out.println(find_maximum_value(a, n)); ` ` ` `} ` `} ` ` ` `// This code is contributed by ajit ` |

*chevron_right*

*filter_none*

## Python

`# Python3 implementation of the approach ` ` ` `# Function to return the maximized value ` `def` `find_maximum_value(a, n): ` ` ` ` ` `sum` `=` `0` ` ` `minimum ` `=` `10` `*` `*` `9` ` ` `pos ` `=` `0` ` ` `neg ` `=` `0` ` ` ` ` `for` `i ` `in` `range` `(n): ` ` ` ` ` `# Overall minimum absolute value ` ` ` `# of some element from the array ` ` ` `minimum ` `=` `min` `(minimum, ` `abs` `(a[i])) ` ` ` ` ` `# Add all absolute values ` ` ` `sum` `+` `=` `abs` `(a[i]) ` ` ` ` ` `# Count positive and negative elements ` ` ` `if` `(a[i] >` `=` `0` `): ` ` ` `pos ` `+` `=` `1` ` ` `else` `: ` ` ` `neg ` `+` `=` `1` ` ` ` ` `# Both positive and negative ` ` ` `# values are present ` ` ` `if` `(pos > ` `0` `and` `neg > ` `0` `): ` ` ` `return` `sum` ` ` ` ` `# Only positive or negative ` ` ` `# values are present ` ` ` `return` `(` `sum` `-` `2` `*` `minimum) ` ` ` `# Driver code ` ` ` `a` `=` `[` `5` `, ` `4` `, ` `6` `, ` `2` `] ` `n ` `=` `len` `(a) ` ` ` `print` `(find_maximum_value(a, n)) ` ` ` `# This code is contributed by mohit kumar 29 ` |

*chevron_right*

*filter_none*

## C#

`// C# implementation of the approach ` `using` `System; ` ` ` `class` `GFG ` `{ ` ` ` ` ` `// Function to return the maximized value ` ` ` `static` `int` `find_maximum_value(` `int` `[]a, ` `int` `n) ` ` ` `{ ` ` ` `int` `sum = 0; ` ` ` `int` `minimum = ` `int` `.MaxValue; ` ` ` `int` `pos = 0, neg = 0; ` ` ` ` ` `for` `(` `int` `i = 0; i < n; i++) ` ` ` `{ ` ` ` ` ` `// Overall minimum absolute value ` ` ` `// of some element from the array ` ` ` `minimum = Math.Min(minimum, Math.Abs(a[i])); ` ` ` ` ` `// Add all absolute values ` ` ` `sum += Math.Abs(a[i]); ` ` ` ` ` `// Count positive and negative elements ` ` ` `if` `(a[i] >= 0) ` ` ` `pos += 1; ` ` ` `else` ` ` `neg += 1; ` ` ` `} ` ` ` ` ` `// Both positive and negative ` ` ` `// values are present ` ` ` `if` `(pos > 0 && neg > 0) ` ` ` `return` `sum; ` ` ` ` ` `// Only positive or negative ` ` ` `// values are present ` ` ` `return` `(sum - 2 * minimum); ` ` ` `} ` ` ` ` ` `// Driver code ` ` ` `static` `public` `void` `Main () ` ` ` `{ ` ` ` `int` `[]a = { 5, 4, 6, 2 }; ` ` ` `int` `n = a.Length; ` ` ` ` ` `Console.WriteLine(find_maximum_value(a, n)); ` ` ` `} ` `} ` ` ` `// This code is contributed by AnkitRai01 ` |

*chevron_right*

*filter_none*

**Output:**

13

**Time Complexity:** O(N)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.

## Recommended Posts:

- Find last remaining element after reducing the Array
- Check if sum of array can be reduced to zero by repetitively reducing array element by their index value
- Modify given array by reducing each element by its next smaller element
- Find last element after deleting every second element in array of n integers
- Find the maximum possible value of last element of the Array
- Maximize sum of array by reducing array elements to contain no triplets (i, j, k) where a[i] < a[j] and a[i] < a[k] and j <i < k
- Maximum value in an array after m range increment operations
- Last seen array element (last appearance is earliest)
- Minimum cost of reducing Array by merging any adjacent elements repetitively
- Maximize the cost of reducing array elements
- Minimum element left from the array after performing given operations
- Find the maximum difference after applying the given operations two times on a number
- Find the last remaining element after repeated removal of odd and even indexed elements alternately
- Maximum Possible Product in Array after performing given Operations
- Maximum count of equal numbers in an array after performing given operations
- Maximum sum of all elements of array after performing given operations
- Maximum number of unique values in the array after performing given operations
- Maximum score possible after performing given operations on an Array
- Maximum possible Array sum after performing given operations
- Maximum count of values of S modulo M lying in a range [L, R] after performing given operations on the array

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.