给定一个正整数数组arr []和一个整数x ,任务是在最多执行一次给定操作后,最小化数组元素的总和。在一次操作中,数组中的任何元素都可以除以x (如果可以被x整除),同时,数组中的任何其他元素都必须乘以x 。
例子:
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
方法:为获得最佳解决方案, x必须与数组中的最小元素相乘,并且只有被x整除的最大元素必须被x除。假设sumAfterOperation是执行该操作后计算出的数组元素的总和,而sum是原始数组中所有元素的总和,则最小化的总和将是min(sum,sumAfterOperation) 。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
#define ll long long int
// Function to return the minimized sum
ll minSum(int arr[], int n, int x)
{
ll sum = 0;
// To store the largest element
// from the array which is
// divisible by x
int largestDivisible = -1, minimum = arr[0];
for (int i = 0; i < n; i++) {
// Sum of array elements before
// performing any operation
sum += arr[i];
// If current element is divisible by x
// and it is maximum so far
if (arr[i] % x == 0 && largestDivisible < arr[i])
largestDivisible = arr[i];
// Update the minimum element
if (arr[i] < minimum)
minimum = arr[i];
}
// If no element can be reduced then there's no point
// in performing the operation as we will end up
// increasing the sum when an element is multiplied by x
if (largestDivisible == -1)
return sum;
// Subtract the chosen elements from the sum
// and then add their updated values
ll sumAfterOperation = sum - minimum - largestDivisible
+ (x * minimum) + (largestDivisible / x);
// Return the minimized sum
return min(sum, sumAfterOperation);
}
// Driver code
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
// Java implementation of the approach
class GFG
{
// Function to return the minimized sum
static int minSum(int arr[], int n, int x)
{
int sum = 0;
// To store the largest element
// from the array which is
// divisible by x
int largestDivisible = -1,
minimum = arr[0];
for (int i = 0; i < n; i++)
{
// Sum of array elements before
// performing any operation
sum += arr[i];
// If current element is divisible
// by x and it is maximum so far
if (arr[i] % x == 0 &&
largestDivisible < arr[i])
largestDivisible = arr[i];
// Update the minimum element
if (arr[i] < minimum)
minimum = arr[i];
}
// If no element can be reduced then
// there's no point in performing the
// operation as we will end up increasing
// the sum when an element is multiplied by x
if (largestDivisible == -1)
return sum;
// Subtract the chosen elements from the
// sum and then add their updated values
int sumAfterOperation = sum - minimum - largestDivisible +
(x * minimum) + (largestDivisible / x);
// Return the minimized sum
return Math.min(sum, sumAfterOperation);
}
// Driver code
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));
}
}
// This code is contributed
// by Code_Mech
Python3
# Python3 implementation of the approach
# Function to return the minimized sum
def minSum(arr, n, x):
Sum = 0
# To store the largest element
# from the array which is
# divisible by x
largestDivisible, minimum = -1, arr[0]
for i in range(0, n):
# Sum of array elements before
# performing any operation
Sum += arr[i]
# If current element is divisible by x
# and it is maximum so far
if(arr[i] % x == 0 and
largestDivisible < arr[i]):
largestDivisible = arr[i]
# Update the minimum element
if arr[i] < minimum:
minimum = arr[i]
# If no element can be reduced then there's
# no point in performing the operation as
# we will end up increasing the sum when an
# element is multiplied by x
if largestDivisible == -1:
return Sum
# Subtract the chosen elements from the
# sum and then add their updated values
sumAfterOperation = (Sum - minimum - largestDivisible +
(x * minimum) + (largestDivisible // x))
# Return the minimized sum
return min(Sum, sumAfterOperation)
# Driver code
if __name__ == "__main__":
arr = [5, 5, 5, 5, 6]
n = len(arr)
x = 3
print(minSum(arr, n, x))
# This code is contributed by Rituraj Jain
C#
// C# implementation of the approach
using System;
class GFG
{
// Function to return the minimized sum
static int minSum(int[] arr, int n, int x)
{
int sum = 0;
// To store the largest element
// from the array which is
// divisible by x
int largestDivisible = -1,
minimum = arr[0];
for (int i = 0; i < n; i++)
{
// Sum of array elements before
// performing any operation
sum += arr[i];
// If current element is divisible
// by x and it is maximum so far
if (arr[i] % x == 0 &&
largestDivisible < arr[i])
largestDivisible = arr[i];
// Update the minimum element
if (arr[i] < minimum)
minimum = arr[i];
}
// If no element can be reduced then
// there's no point in performing the
// operation as we will end up increasing
// the sum when an element is multiplied by x
if (largestDivisible == -1)
return sum;
// Subtract the chosen elements from the
// sum and then add their updated values
int sumAfterOperation = sum - minimum - largestDivisible +
(x * minimum) + (largestDivisible / x);
// Return the minimized sum
return Math.Min(sum, sumAfterOperation);
}
// Driver code
public static void Main()
{
int[] arr = { 5, 5, 5, 5, 6 };
int n = arr.Length;
int x = 3;
Console.WriteLine(minSum(arr, n, x));
}
}
// This code is contributed
// by Code_Mech
PHP
输出:
26