📌  相关文章
📜  执行给定操作后数组元素的最小可能总和

📅  最后修改于: 2021-04-23 06:58:51             🧑  作者: Mango

给定一个正整数数组arr []和一个整数x ,任务是在最多执行一次给定操作后,最小化数组元素的总和。在一次操作中,数组中的任何元素都可以除以x (如果可以被x整除),同时,数组中的任何其他元素都必须乘以x

例子:

方法:为获得最佳解决方案, 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