Minimize the sum of the array according the given condition
Last Updated :
24 May, 2022
Given an array of integers A. The task is to minimize the sum of the elements of the array using the following rule:
Choose two indices i and j and an arbitrary integer x, such that x is a divisor of A[i] and change them as following A[i] = A[i]/x and A[j] = A[j]*x.
Examples:
Input: A = { 1, 2, 3, 4, 5 }
Output: 14
Divide A[3] by 2 then
A[3] = 4/2 = 2,
Multiply A[0] by 2 then
A[0] = 1*2 = 2
Updated array A = { 2, 2, 3, 2, 5 }
Hence sum = 14
Input: A = { 2, 4, 2, 3, 7 }
Output: 18
Approach: If any number is divided by x then it is optimal to multiply the x with the smallest number present in the array.
The idea is to get the minimum of the array and find the divisors of the particular element and keep checking that by how much the sum is reduced.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void findMin( int arr[], int n)
{
int sum = 0;
for ( int i = 0; i < n; i++)
sum += arr[i];
sort(arr, arr + n);
int min = arr[0];
int max = 0;
for ( int i = n - 1; i >= 1; i--) {
int num = arr[i];
int total = num + min;
int j;
for (j = 2; j <= num; j++) {
if (num % j == 0) {
int d = j;
int now = (num / d)
+ (min * d);
int reduce = total - now;
if (reduce > max)
max = reduce;
}
}
}
cout << (sum - max);
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
int n = sizeof (arr) / sizeof (arr[0]);
findMin(arr, n);
}
|
Java
import java.util.*;
class GFG
{
static void findMin( int arr[], int n)
{
int sum = 0 ;
for ( int i = 0 ; i < n; i++)
sum += arr[i];
Arrays.sort(arr);
int min = arr[ 0 ];
int max = 0 ;
for ( int i = n - 1 ; i >= 1 ; i--)
{
int num = arr[i];
int total = num + min;
int j;
for (j = 2 ; j <= num; j++)
{
if (num % j == 0 )
{
int d = j;
int now = (num / d) +
(min * d);
int reduce = total - now;
if (reduce > max)
max = reduce;
}
}
}
System.out.println(sum - max);
}
public static void main (String[] args)
{
int arr[] = { 1 , 2 , 3 , 4 , 5 };
int n = arr.length;
findMin(arr, n);
}
}
|
Python3
def findMin(arr, n):
sum = 0
for i in range ( 0 , n):
sum = sum + arr[i]
arr.sort()
min = arr[ 0 ]
max = 0
for i in range (n - 1 , 0 , - 1 ):
num = arr[i]
total = num + min
for j in range ( 2 , num + 1 ):
if (num % j = = 0 ):
d = j
now = (num / / d) + ( min * d)
reduce = total - now
if ( reduce > max ):
max = reduce
print ( sum - max )
arr = [ 1 , 2 , 3 , 4 , 5 ]
n = len (arr)
findMin(arr, n)
|
C#
using System;
class GFG
{
static void findMin( int []arr, int n)
{
int sum = 0;
for ( int i = 0; i < n; i++)
sum += arr[i];
Array.Sort(arr);
int min = arr[0];
int max = 0;
for ( int i = n - 1; i >= 1; i--)
{
int num = arr[i];
int total = num + min;
int j;
for (j = 2; j <= num; j++)
{
if (num % j == 0)
{
int d = j;
int now = (num / d) +
(min * d);
int reduce = total - now;
if (reduce > max)
max = reduce;
}
}
}
Console.WriteLine(sum - max);
}
public static void Main (String[] args)
{
int []arr = { 1, 2, 3, 4, 5 };
int n = arr.Length;
findMin(arr, n);
}
}
|
Javascript
<script>
function findMin(arr, n)
{
let sum = 0;
for (let i = 0; i < n; i++)
sum += arr[i];
arr.sort();
let min = arr[0];
let max = 0;
for (let i = n - 1; i >= 1; i--) {
let num = arr[i];
let total = num + min;
let j;
for (j = 2; j <= num; j++) {
if (num % j == 0) {
let d = j;
let now = parseInt(num / d)
+ (min * d);
let reduce = total - now;
if (reduce > max)
max = reduce;
}
}
}
document.write(sum - max);
}
let arr = [ 1, 2, 3, 4, 5 ];
let n = arr.length;
findMin(arr, n);
</script>
|
Time Complexity: O((N * logN) + (N * M)), where N is the size of the given array and M is the maximum element in the array.
Auxiliary Space: O(1), no extra space is required, so it is a constant.
Share your thoughts in the comments
Please Login to comment...