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

时间:2016-10-19 17:50:08

标签: c++ arrays algorithm math

比赛中存在一个问题,即需要计算仅包含数学和生物科目的班级表现。所以,有' n' n没有。数学学生和' N'没有。生物学生。每个学生都有一个单独的分数。数学学生和生物学生分数存储在数组mathScore []和bioScore中。全班的表现计算如下: (mathScore [0] * bioScore [0] + mathScore [1] * bioScore [1] + ....... + mathScore [n-1] * bioScore [n-1])

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

现在给出一个值' m',我们必须最大化该课程的总分。我们可以通过将任何候选人的得分增加或减少1,最多为' m'倍。现在的问题是,你只能增加一组的得分。数学'或者生物学。

现在谈到解决方案,据我说,这个问题需要两步。首先是决定选择哪个组,即Maths或Bio。第二步是从所选择的群体中选择学生,以便增加或减少那些特定(选定)的学生'得分将最大化表现。

我尝试过这样做的第一步: 考虑这是班级的分数

Maths Score :  5  7  4 -3
Bio Score   : -2  3  9  2

m = 1; 因此,我们将迭代Maths得分数组。同时比较生物学生的相应分数。所以,我们选择了Maths数组。因为如果我们只需要增加一次。然后增加Maths数组中的4将是有益的。 '因为它会使整体表现提高9点。这是最大的。

同样是第二步的方法。找到其他组中相应分数最高的分数。增加该特定元素。

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

P.S。我不是大学生。这不是功课。

1 个答案:

答案 0 :(得分:1)

We have Sum(Abs(o[i])) == m m > 0, and a[i], b[i], m fixed.

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

So to maximize it, we just have to maximize

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

And we have

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

And as we can choose sign of o[i], we can maximize instead

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

which is

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

and

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

and with j so that b[j] == Max(Abs(b[i])), o[j] == sign(b[j]) * m, o[i] == 0, we have

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

So you have to find maximum of the both array (of absolute value).

So in your example

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

And for other example:

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