最大化两个数组元素乘积和的算法

Algorithm to maximize the sum of product of elements of two arrays

本文关键字:和的 算法 数组元素 两个 最大化      更新时间:2023-10-16

在一次竞赛中有一个问题要求计算只有数学和生物科目的班级的成绩。所以,有n个不。数学学生& &;"n"。生物系学生。每个学生都有自己的分数。数学学生和生物学生的分数分别存储在数组mathScore[]和bioScore中。整个班级的成绩计算如下:(mathScore [0] * bioScore [0] + mathScore [1] * bioScore [1 ] + .......+ mathScore (n - 1) * bioScore [n])

用mathScore[0]表示第一个数学学生的分数。bioScore[0]也是如此。

现在给定一个值'm',我们必须最大化这个类的总分。我们可以通过增加或减少任何候选人的分数1来做到这一点,最多是m次。问题是,你只能增加一个组的分数。不是数学就是生物。

现在来解决这个问题,据我所知,这个问题需要两步。首先是决定选哪一组,即数学还是生物。第二步是从被选中的组中选择学生,这样增加或减少这些特定(被选中的)学生的分数将使表现最大化。

我试着思考第一步,这样:考虑这是class

的分数
Maths Score :  5  7  4 -3
Bio Score   : -2  3  9  2

m = 1;因此,我们将遍历math分数数组。同时比较生物系学生的相应成绩。所以,我们选择了math数组。因为如果我们只需要增加一次。那么增加math数组中的4将是有益的。因为它会使整体性能提高9倍。哪个是最大的。

第二步也是同样的方法。找出另一组中对应得分最高的分数。增加特定元素

现在,这是一个有点粗略的想法。但它并不是适用于所有的可能性。所以,任何帮助都将是感激的。

注:我不是大学生。这不是家庭作业

我们有Sum(Abs(o[i])) == m, m > 0, a[i], b[i], m固定。

Sum( (a[i] + o[i]) * b[i]) == Sum(a[i] * b[i]) + Sum(o[i] * b[i])

要最大化它,我们只需要最大化

Sum(o[i] * b[i])

还有

o[i] * b[i] <= Abs(o[i] * b[i])

当我们选择o[i]的符号时,我们可以最大化

Sum(Abs(o[i] * b[i]))

Sum(Abs(o[i]) * Abs(b[i]))

Max(Sum(Abs(o[i]) * Abs(b[i]))) <= m * Max(Abs(b[i]))

j所以b[j] == Max(Abs(b[i])) o[j] == sign(b[j]) * m o[i] == 0,我们有

Sum(o[i] * b[i]) == m * Max(Abs(b[i]))

所以你必须找到两个数组的最大值(绝对值)

在你的例子中

Maths Score :  5  7  (4+m) -3
Bio Score   : -2  3  9      2

,例如:

Maths Score :  5  7  (4-m) -3
Bio Score   : -2  3  -9     2