比赛中存在一个问题,即需要计算仅包含数学和生物科目的班级表现。所以,有' 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。我不是大学生。这不是功课。
答案 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