Minimize sum by dividing all elements of a subarray by K
Last Updated :
10 Mar, 2022
Given an array arr[] of N integers and a positive integer K, the task is to minimize the sum of the array elements after performing the given operation atmost one time. The operation is to choose a subarray and divide all elements of the subarray by K. Find and print the minimum possible sum.
Examples:
Input: arr[] = {1, -2, 3}, K = 2
Output: 0.5
Choose the subarray {3} and divide them by K
The array becomes {1, -2, 1.5} where 1 – 2 + 1.5 = 0.5
Input: arr[] = {-1, -2, -3, -5}, K = 4
Output: -11
There is no need to perform the operation as the
sum of the array elements is already minimum.
Approach:
- Find the maximum sum subarray using Kadane’s Algorithm say maxSum as it will be the subarray which will be contributing in maximizing the sum of the array.
- Now there are two cases:
- maxSum > 0: Divide every element of the found subarray with K and the sum of the resultant array will be minimum possible.
- maxSum ? 0: No need to perform the operation as the sum of the array is already minimum.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int maxSubArraySum( int a[], int size)
{
int max_so_far = INT_MIN, max_ending_here = 0;
for ( int i = 0; i < size; i++) {
max_ending_here = max_ending_here + a[i];
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
if (max_ending_here < 0)
max_ending_here = 0;
}
return max_so_far;
}
double minimizedSum( int a[], int n, int K)
{
int sum = maxSubArraySum(a, n);
double totalSum = 0;
for ( int i = 0; i < n; i++)
totalSum += a[i];
if (sum < 0)
return totalSum;
totalSum = totalSum - sum + ( double )sum / ( double )K;
return totalSum;
}
int main()
{
int a[] = { 1, -2, 3 };
int n = sizeof (a) / sizeof (a[0]);
int K = 2;
cout << minimizedSum(a, n, K);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int maxSubArraySum( int a[], int size)
{
int max_so_far = Integer.MIN_VALUE,
max_ending_here = 0 ;
for ( int i = 0 ; i < size; i++)
{
max_ending_here = max_ending_here + a[i];
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
if (max_ending_here < 0 )
max_ending_here = 0 ;
}
return max_so_far;
}
static double minimizedSum( int a[], int n, int K)
{
int sum = maxSubArraySum(a, n);
double totalSum = 0 ;
for ( int i = 0 ; i < n; i++)
totalSum += a[i];
if (sum < 0 )
return totalSum;
totalSum = totalSum - sum + ( double )sum /
( double )K;
return totalSum;
}
public static void main(String []args)
{
int a[] = { 1 , - 2 , 3 };
int n = a.length;
int K = 2 ;
System.out.println(minimizedSum(a, n, K));
}
}
|
Python3
import sys
def maxSubArraySum(a, size) :
max_so_far = - (sys.maxsize - 1 );
max_ending_here = 0 ;
for i in range (size) :
max_ending_here = max_ending_here + a[i];
if (max_so_far < max_ending_here) :
max_so_far = max_ending_here;
if (max_ending_here < 0 ) :
max_ending_here = 0 ;
return max_so_far;
def minimizedSum(a, n, K) :
sum = maxSubArraySum(a, n);
totalSum = 0 ;
for i in range (n) :
totalSum + = a[i];
if ( sum < 0 ) :
return totalSum;
totalSum = totalSum - sum + sum / K;
return totalSum;
if __name__ = = "__main__" :
a = [ 1 , - 2 , 3 ];
n = len (a);
K = 2 ;
print (minimizedSum(a, n, K));
|
C#
using System;
class GFG
{
static int maxSubArraySum( int []a, int size)
{
int max_so_far = int .MinValue,
max_ending_here = 0;
for ( int i = 0; i < size; i++)
{
max_ending_here = max_ending_here + a[i];
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
if (max_ending_here < 0)
max_ending_here = 0;
}
return max_so_far;
}
static double minimizedSum( int []a, int n, int K)
{
int sum = maxSubArraySum(a, n);
double totalSum = 0;
for ( int i = 0; i < n; i++)
totalSum += a[i];
if (sum < 0)
return totalSum;
totalSum = totalSum - sum + ( double )sum /
( double )K;
return totalSum;
}
public static void Main(String []args)
{
int []a = { 1, -2, 3 };
int n = a.Length;
int K = 2;
Console.WriteLine(minimizedSum(a, n, K));
}
}
|
Javascript
<script>
function maxSubArraySum(a, size)
{
var max_so_far = -1000000000, max_ending_here = 0;
for ( var i = 0; i < size; i++) {
max_ending_here = max_ending_here + a[i];
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
if (max_ending_here < 0)
max_ending_here = 0;
}
return max_so_far;
}
function minimizedSum(a, n, K)
{
var sum = maxSubArraySum(a, n);
var totalSum = 0;
for ( var i = 0; i < n; i++)
totalSum += a[i];
if (sum < 0)
return totalSum;
totalSum = totalSum - sum + sum / K;
return totalSum;
}
var a = [1, -2, 3];
var n = a.length;
var K = 2;
document.write( minimizedSum(a, n, K));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...