Maximum array sum that can be obtained after exactly k changes
Given an array arr[] of n integers and an integer k. The task is to maximize the sum of the array after performing the given operation exactly k times. In a single operation, any element of the array can be multiplied by -1 i.e. the sign of the element can be changed.
Examples:
Input: arr[] = {-5, 4, 1, 3, 2}, k = 4
Output: 13
Change the sign of -5 once and then change the sign of 1 three times.
Thus, it changes to -1 and the sum will be 5 + 4 + (-1) + 3 + 2 = 13.
Input: arr[] = {-1, -1, 1}, k = 1
Output: 1
Approach: If the count of negative elements in the array is count,
- If count ? k then the sign of exactly k negative numbers will be changed starting from the smallest.
- If count < k then change the sign of all the negative elements to positive and for the remaining operations i.e. rem = k – count,
- If rem % 2 = 0 then no changes will be done to the current array as changing the sign of an element twice gives the original number.
- If rem % 2 = 1 then change the sign of the smallest element from the updated array.
- Finally, print the sum of the elements of the updated array.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int sumArr( int arr[], int n)
{
int sum = 0;
for ( int i = 0; i < n; i++)
sum += arr[i];
return sum;
}
int maxSum( int arr[], int n, int k)
{
sort(arr, arr + n);
int i = 0;
while (i < n && k > 0 && arr[i] < 0) {
arr[i] *= -1;
k--;
i++;
}
if (k % 2 == 1) {
int min = 0;
for (i = 1; i < n; i++)
if (arr[min] > arr[i])
min = i;
arr[min] *= -1;
}
return sumArr(arr, n);
}
int main()
{
int arr[] = { -5, 4, 1, 3, 2 };
int n = sizeof (arr) / sizeof (arr[0]);
int k = 4;
cout << maxSum(arr, n, k) << endl;
return 0;
}
|
Java
import java.util.Arrays;
class GFG
{
static int sumArr( int arr[], int n)
{
int sum = 0 ;
for ( int i = 0 ; i < n; i++)
sum += arr[i];
return sum;
}
static int maxSum( int arr[], int n, int k)
{
Arrays.sort(arr);
int i = 0 ;
while (i < n && k > 0 && arr[i] < 0 )
{
arr[i] *= - 1 ;
k--;
i++;
}
if (k % 2 == 1 )
{
int min = 0 ;
for (i = 1 ; i < n; i++)
if (arr[min] > arr[i])
min = i;
arr[min] *= - 1 ;
}
return sumArr(arr, n);
}
public static void main(String[] args)
{
int arr[] = { - 5 , 4 , 1 , 3 , 2 };
int n = arr.length;
int k = 4 ;
System.out.println(maxSum(arr, n, k));
}
}
|
Python3
def sumArr(arr, n):
sum = 0
for i in range (n):
sum + = arr[i]
return sum
def maxSum(arr, n, k):
arr.sort(reverse = False )
i = 0
while (i < n and k > 0 and arr[i] < 0 ):
arr[i] * = - 1
k - = 1
i + = 1
if (k % 2 = = 1 ):
min = 0
for i in range ( 1 , n):
if (arr[ min ] > arr[i]):
min = i
arr[ min ] * = - 1
return sumArr(arr, n)
if __name__ = = '__main__' :
arr = [ - 5 , 4 , 1 , 3 , 2 ]
n = len (arr)
k = 4
print (maxSum(arr, n, k))
|
C#
using System;
using System.Linq;
class GFG
{
static int sumArr( int [] arr, int n)
{
int sum = 0;
for ( int i = 0; i < n; i++)
sum += arr[i];
return sum;
}
static int maxSum( int [] arr, int n, int k)
{
Array.Sort(arr);
int i = 0;
while (i < n && k > 0 && arr[i] < 0)
{
arr[i] *= -1;
k--;
i++;
}
if (k % 2 == 1)
{
int min = 0;
for (i = 1; i < n; i++)
if (arr[min] > arr[i])
min = i;
arr[min] *= -1;
}
return sumArr(arr, n);
}
static void Main()
{
int []arr= { -5, 4, 1, 3, 2 };
int n = arr.Length;
int k = 4;
Console.WriteLine(maxSum(arr, n, k));
}
}
|
PHP
<?php
function sumArr( $arr , $n )
{
$sum = 0;
for ( $i = 0; $i < $n ; $i ++)
$sum += $arr [ $i ];
return $sum ;
}
function maxSum( $arr , $n , $k )
{
sort( $arr );
$i = 0;
while ( $i < $n && $k > 0 &&
$arr [ $i ] < 0)
{
$arr [ $i ] *= -1;
$k --;
$i ++;
}
if ( $k % 2 == 1)
{
$min = 0;
for ( $i = 1; $i < $n ; $i ++)
if ( $arr [ $min ] > $arr [ $i ])
$min = $i ;
$arr [ $min ] *= -1;
}
return sumArr( $arr , $n );
}
$arr = array ( -5, 4, 1, 3, 2 );
$n = sizeof( $arr );
$k = 4;
echo maxSum( $arr , $n , $k ), "\n" ;
?>
|
Javascript
<script>
function sumArr(arr, n)
{
let sum = 0;
for (let i = 0; i < n; i++)
sum += arr[i];
return sum;
}
function maxSum(arr, n, k)
{
arr.sort( function (a, b){ return a - b});
let i = 0;
while (i < n && k > 0 && arr[i] < 0)
{
arr[i] *= -1;
k--;
i++;
}
if (k % 2 == 1)
{
let min = 0;
for (i = 1; i < n; i++)
if (arr[min] > arr[i])
min = i;
arr[min] *= -1;
}
return sumArr(arr, n);
}
let arr= [ -5, 4, 1, 3, 2 ];
let n = arr.length;
let k = 4;
document.write(maxSum(arr, n, k));
</script>
|
Time Complexity: O(n * log n)
Auxiliary Space: O(1)
Last Updated :
09 Jun, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...