如何最大化总和?

时间:2019-06-10 13:43:04

标签: arrays algorithm sorting implementation

我们得到了一个排序数组。

pass的初始值为零。

我们可以多次执行以下操作:

  1. 一次选择任何k个数字。全部添加。将此金额加到pass

  2. 如果是第一次 从数组中选择一个数字x,则该数字仅被视为x。如果第二次选择它,则将其视为-x,第三次将其视为x,依此类推...

例如,让数组为[-14, 10, 6, -6, -10, -10, -14]k = 4,我们将只执行一次操作。我们选择以下4个数字:{14, 10, 6, -6}。将它们加起来,得到24。然后,pass=pass+24。因此,通过的最大值为24

如何获取pass的最大值?

1 个答案:

答案 0 :(得分:4)

我们可以将问题重新表述如下:

我们有一个数字列表,我们可以激活或停用这些数字。我们想要找到激活数字的最大和,在每遍中我们可以准确地切换k个数字。

对于奇数k,我们可以执行以下操作:激活最大数字(如果为正数),然后使用其余的(k-1)开关两次切换任意数字,这将有效地将数字保留在它以前的状态。因此,pass的最大值是正数之和。

对于偶数k来说,这略有不同,因为激活数字的数量始终为偶数。因此,我们首先找到所有正数。设正数为p。如果p是偶数,那么我们就好,这些数字的总和就是结果。如果p为奇数,我们必须检查两种情况:删除最小的正数或添加最大的非正数。这两种情况的最大值是结果。

根据评论进行编辑:

对于特殊情况k=n,只有两个选择:要么包含所有数字,要么排除所有数字。如果数字的总和大于0,则为结果。否则,结果为0。