Given an array arr[] of positive integers and an integer x, the task is to minimize the sum of elements of the array after performing the given operation at most once. In a single operation, any element from the array can be divided by x (if it is divisible by x) and at the same time, any other element from the array must be multiplied by x.
Examples:
Input: arr[] = {1, 2, 3, 4, 5}, x = 2
Output: 14
Multiply 1 by x i.e. 1 * 2 = 2
Divide 4 by x i.e. 4 / 2 = 2
And the updated sum will be 2 + 2 + 3 + 2 + 5 = 14
Input: arr[] = {5, 5, 5, 5, 6}, x = 3
Output: 26
Approach: For an optimal solution, x must be multiplied with the smallest element from the array and only the largest element divisible by x must be divided by it. Let sumAfterOperation be the sum of the array elements calculated after performing the operation and sum be the sum of all the elements of the original array then the minimized sum will be min(sum, sumAfterOperation).
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
ll minSum( int arr[], int n, int x)
{
ll sum = 0;
int largestDivisible = -1, minimum = arr[0];
for ( int i = 0; i < n; i++) {
sum += arr[i];
if (arr[i] % x == 0 && largestDivisible < arr[i])
largestDivisible = arr[i];
if (arr[i] < minimum)
minimum = arr[i];
}
if (largestDivisible == -1)
return sum;
ll sumAfterOperation = sum - minimum - largestDivisible
+ (x * minimum) + (largestDivisible / x);
return min(sum, sumAfterOperation);
}
int main()
{
int arr[] = { 5, 5, 5, 5, 6 };
int n = sizeof (arr) / sizeof (arr[0]);
int x = 3;
cout << minSum(arr, n, x);
return 0;
}
|
Java
class GFG
{
static int minSum( int arr[], int n, int x)
{
int sum = 0 ;
int largestDivisible = - 1 ,
minimum = arr[ 0 ];
for ( int i = 0 ; i < n; i++)
{
sum += arr[i];
if (arr[i] % x == 0 &&
largestDivisible < arr[i])
largestDivisible = arr[i];
if (arr[i] < minimum)
minimum = arr[i];
}
if (largestDivisible == - 1 )
return sum;
int sumAfterOperation = sum - minimum - largestDivisible +
(x * minimum) + (largestDivisible / x);
return Math.min(sum, sumAfterOperation);
}
public static void main(String[] args)
{
int arr[] = { 5 , 5 , 5 , 5 , 6 };
int n =arr.length;
int x = 3 ;
System.out.println(minSum(arr, n, x));
}
}
|
Python3
def minSum(arr, n, x):
Sum = 0
largestDivisible, minimum = - 1 , arr[ 0 ]
for i in range ( 0 , n):
Sum + = arr[i]
if (arr[i] % x = = 0 and
largestDivisible < arr[i]):
largestDivisible = arr[i]
if arr[i] < minimum:
minimum = arr[i]
if largestDivisible = = - 1 :
return Sum
sumAfterOperation = ( Sum - minimum - largestDivisible +
(x * minimum) + (largestDivisible / / x))
return min ( Sum , sumAfterOperation)
if __name__ = = "__main__" :
arr = [ 5 , 5 , 5 , 5 , 6 ]
n = len (arr)
x = 3
print (minSum(arr, n, x))
|
C#
using System;
class GFG
{
static int minSum( int [] arr, int n, int x)
{
int sum = 0;
int largestDivisible = -1,
minimum = arr[0];
for ( int i = 0; i < n; i++)
{
sum += arr[i];
if (arr[i] % x == 0 &&
largestDivisible < arr[i])
largestDivisible = arr[i];
if (arr[i] < minimum)
minimum = arr[i];
}
if (largestDivisible == -1)
return sum;
int sumAfterOperation = sum - minimum - largestDivisible +
(x * minimum) + (largestDivisible / x);
return Math.Min(sum, sumAfterOperation);
}
public static void Main()
{
int [] arr = { 5, 5, 5, 5, 6 };
int n = arr.Length;
int x = 3;
Console.WriteLine(minSum(arr, n, x));
}
}
|
PHP
<?php
function minSum( $arr , $n , $x )
{
$sum = 0;
$largestDivisible = -1;
$minimum = $arr [0];
for ( $i = 0; $i < $n ; $i ++)
{
$sum += $arr [ $i ];
if ( $arr [ $i ] % $x == 0 &&
$largestDivisible < $arr [ $i ])
$largestDivisible = $arr [ $i ];
if ( $arr [ $i ] < $minimum )
$minimum = $arr [ $i ];
}
if ( $largestDivisible == -1)
return $sum ;
$sumAfterOperation = $sum - $minimum - $largestDivisible +
( $x * $minimum ) + ( $largestDivisible / $x );
return min( $sum , $sumAfterOperation );
}
$arr = array ( 5, 5, 5, 5, 6 );
$n = sizeof( $arr );
$x = 3;
print (minSum( $arr , $n , $x ));
?>
|
Javascript
<script>
function minSum(arr , n , x) {
var sum = 0;
var largestDivisible = -1, minimum = arr[0];
for (i = 0; i < n; i++) {
sum += arr[i];
if (arr[i] % x == 0 && largestDivisible < arr[i])
largestDivisible = arr[i];
if (arr[i] < minimum)
minimum = arr[i];
}
if (largestDivisible == -1)
return sum;
var sumAfterOperation = sum - minimum - largestDivisible
+ (x * minimum) + (largestDivisible / x);
return Math.min(sum, sumAfterOperation);
}
var arr = [ 5, 5, 5, 5, 6 ];
var n = arr.length;
var x = 3;
document.write(minSum(arr, n, x));
</script>
|
Time Complexity: O(N), as we are using a loop to traverse N times so it will cost us O(N) time
Auxiliary Space: O(1), as we are not using any extra space.