📜  两个数组的乘积的最小总和

📅  最后修改于: 2021-10-26 06:56:53             🧑  作者: Mango

假设第一个数组允许进行 k 次修改,求出两个相同大小数组的 Products 的最小总和。在每次修改中,第一个数组的一个数组元素可以增加或减少 2。
例子:

Input : a[] = {1, 2, -3}
        b[]  = {-2, 3, -5}
           k = 5
Output : -31
Explanation:
Here n = 3 and k = 5. 
So, we modified a[2], which is -3 and 
increased it by 10 (as 5 modifications 
are allowed).
Final sum will be :
(1 * -2) + (2 * 3) + (7 * -5)
   -2    +    6    -    35
             -31
(which is the minimum sum of the array 
with given conditions)

Input : a[] = {2, 3, 4, 5, 4}
        b[] = {3, 4, 2, 3, 2}
Output : 25
Explanation: 
Here, total numbers are 5 and total 
modifications allowed are 3. So, modify 
a[1], which is 3 and decreased it by 6 
(as 3 modifications are allowed).
Final sum will be :
(2 * 3) + (-3 * 4) + (4 * 2) + (5 * 3) + (4 * 2)
   6    –    12    +    8    +    15   +    8
                        25
(which is the minimum sum of the array with 
given conditions)

由于我们需要最小化乘积和,我们找到最大的乘积并减少它。通过举一些例子,我们观察到仅对一个元素进行 2*k 次更改就足以获得最小和。基于此观察,我们将每个元素视为我们对其应用所有 k 操作的元素,并跟踪将结果减少到最小值的元素。

C++
// CPP program to find minimum sum of product
// of two arrays with k operations allowed on
// first array.
#include 
using namespace std;
 
// Function to find the minimum product
int minproduct(int a[], int b[], int n, int k)
{
    int diff = 0, res = 0;
    int temp;
    for (int i = 0; i < n; i++) {
 
        // Find product of current elements and update
        // result.
        int pro = a[i] * b[i];
        res = res + pro;
 
        // If both product and b[i] are negative,
        // we must increase value of a[i] to minimize
        // result.
        if (pro < 0 && b[i] < 0)
            temp = (a[i] + 2 * k) * b[i];
 
        // If both product and a[i] are negative,
        // we must decrease value of a[i] to minimize
        // result.
        else if (pro < 0 && a[i] < 0)
            temp = (a[i] - 2 * k) * b[i];
 
        // Similar to above two cases for positive
        // product.
        else if (pro > 0 && a[i] < 0)
            temp = (a[i] + 2 * k) * b[i];
        else if (pro > 0 && a[i] > 0)
            temp = (a[i] - 2 * k) * b[i];
 
        // Check if current difference becomes higher
        // than the maximum difference so far.
        int d = abs(pro - temp);
        if (d > diff)
            diff = d;       
    }
 
    return res - diff;
}
 
// Driver function
int main()
{
    int a[] = { 2, 3, 4, 5, 4 };
    int b[] = { 3, 4, 2, 3, 2 };
    int n = 5, k = 3;
    cout << minproduct(a, b, n, k)
         << endl;
    return 0;
}


Java
// Java program to find minimum sum
// of product of two arrays with k
// operations allowed on first array.
import java.math.*;
 
class GFG {
 
// Function to find the minimum product
static int minproduct(int a[], int b[], int n,
                                       int k)
{
    int diff = 0, res = 0;
    int temp = 0;
    for (int i = 0; i < n; i++) {
 
        // Find product of current elements
        // and update result.
        int pro = a[i] * b[i];
        res = res + pro;
 
        // If both product and b[i] are
        // negative, we must increase value
        // of a[i] to minimize result.
        if (pro < 0 && b[i] < 0)
            temp = (a[i] + 2 * k) * b[i];
 
        // If both product and a[i] are
        // negative, we must decrease value
        // of a[i] to minimize result.
        else if (pro < 0 && a[i] < 0)
            temp = (a[i] - 2 * k) * b[i];
 
        // Similar to above two cases
        // for positive product.
        else if (pro > 0 && a[i] < 0)
            temp = (a[i] + 2 * k) * b[i];
        else if (pro > 0 && a[i] > 0)
            temp = (a[i] - 2 * k) * b[i];
 
        // Check if current difference
        // becomes higher than the maximum
        // difference so far.
        int d = Math.abs(pro - temp);
        if (d > diff)
            diff = d;    
    }
 
    return res - diff;
}
 
// Driver function
public static void main(String[] args)
{
    int a[] = { 2, 3, 4, 5, 4 };
    int b[] = { 3, 4, 2, 3, 2 };
    int n = 5, k = 3;
    System.out.println(minproduct(a, b, n, k));
}
}
 
// This code is contributed by Prerna Saini


Python3
# Python program to find
# minimum sum of product
# of two arrays with k
# operations allowed on
# first array.
 
# Function to find the minimum product
def minproduct(a,b,n,k):
 
    diff = 0
    res = 0
    for i in range(n):
 
        # Find product of current
        # elements and update result.
        pro = a[i] * b[i]
        res = res + pro
 
        # If both product and
        # b[i] are negative,
        # we must increase value
        # of a[i] to minimize result.
        if (pro < 0 and b[i] < 0):
            temp = (a[i] + 2 * k) * b[i]
 
        # If both product and
        # a[i] are negative,
        # we must decrease value
        # of a[i] to minimize result.
        elif (pro < 0 and a[i] < 0):
            temp = (a[i] - 2 * k) * b[i]
 
        # Similar to above two cases
        # for positive product.
        elif (pro > 0 and a[i] < 0):
            temp = (a[i] + 2 * k) * b[i]
        elif (pro > 0 and a[i] > 0):
            temp = (a[i] - 2 * k) * b[i]
 
        # Check if current difference
        # becomes higher
        # than the maximum difference so far.
        d = abs(pro - temp)
 
        if (d > diff):
            diff = d      
    return res - diff
 
# Driver function
a = [ 2, 3, 4, 5, 4 ]
b = [ 3, 4, 2, 3, 2 ]
n = 5
k = 3
 
print(minproduct(a, b, n, k))
 
# This code is contributed
# by Azkia Anam.


C#
// C# program to find minimum sum
// of product of two arrays with k
// operations allowed on first array.
using System;
 
class GFG {
 
    // Function to find the minimum product
    static int minproduct(int []a, int []b,
                                int n, int k)
    {
        int diff = 0, res = 0;
        int temp = 0;
        for (int i = 0; i < n; i++)
        {
     
            // Find product of current elements
            // and update result.
            int pro = a[i] * b[i];
            res = res + pro;
     
            // If both product and b[i] are
            // negative, we must increase value
            // of a[i] to minimize result.
            if (pro < 0 && b[i] < 0)
                temp = (a[i] + 2 * k) * b[i];
     
            // If both product and a[i] are
            // negative, we must decrease value
            // of a[i] to minimize result.
            else if (pro < 0 && a[i] < 0)
                temp = (a[i] - 2 * k) * b[i];
     
            // Similar to above two cases
            // for positive product.
            else if (pro > 0 && a[i] < 0)
                temp = (a[i] + 2 * k) * b[i];
            else if (pro > 0 && a[i] > 0)
                temp = (a[i] - 2 * k) * b[i];
     
            // Check if current difference
            // becomes higher than the maximum
            // difference so far.
            int d = Math.Abs(pro - temp);
            if (d > diff)
                diff = d;
        }
     
        return res - diff;
    }
     
    // Driver function
    public static void Main()
    {
        int []a = { 2, 3, 4, 5, 4 };
        int []b = { 3, 4, 2, 3, 2 };
        int n = 5, k = 3;
         
        Console.WriteLine(minproduct(a, b, n, k));
    }
}
 
// This code is contributed by vt_m.


PHP
 0 and $a[$i] < 0)
            $temp = ($a[$i] + 2 * $k) * $b[$i];
        else if ($pro > 0 and $a[$i] > 0)
            $temp = ($a[$i] - 2 * $k) * $b[$i];
 
        // Check if current difference becomes higher
        // than the maximum difference so far.
        $d = abs($pro - $temp);
        if ($d > $diff)
            $diff = $d;
    }
 
    return $res - $diff;
}
 
    // Driver Code
    $a = array(2, 3, 4, 5, 4 ,0);
    $b =array(3, 4, 2, 3, 2);
    $n = 5;
    $k = 3;
    echo minproduct($a, $b, $n, $k);
     
// This code is contributed by anuj_67.
?>


Javascript


输出 :

25

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程