需要一些简单的逻辑帮助,已经卡住了几个小时

时间:2016-03-31 10:06:08

标签: c logic

问题是要求获取任意数量的数字,并在连续数字之间找到最大可能的差异总和(使用绝对值)。例如,数字1 2和3将被排列为3 1 2以获得3的总和(3-1 = 2,并且1-2 = 1)。

现在我的第一个想法是采用列表中最高的数字,然后是最低的数字,并以此方式安排到最后,但这不会有效,因为列表的末尾最终会包含所有数字中间积累几乎没有差异。我想到的唯一另一件事是找到每一个可能的顺序并返回最高的总和,但是如果列表更长,这将花费太长时间,我认为可能有更好的方法。

这里有一些参考输入和输出数字

9 2 5 3 1  ->  21
7 3 4 5 5 7 6 8 5 4 -> 24

任何帮助都会非常感激,即使它只是指向我正确的方向。

1 个答案:

答案 0 :(得分:3)

这个问题有两种方法。

方法1:

蛮力。

方法2:

找出如何排列数字的算法。

如果可行,我总是更喜欢方法2。

如果你订购数字高 - 低 - 高 - 低 - 高,你会获得高额金额似乎是合理的......

首先,对数字进行排序,然后将它们分成两个同样大的低数字和高数字组。如果有一个奇数个数字,中间的数字将被遗留下来。

然后你只需从两组中交替选择数字。

只要你坚持使用高 - 低 - 高 - 低顺序,很容易证明内部数字的顺序并不重要。 但是,由于起始和结束编号只有一个邻居,因此第一个和最后一个数字应该是中间数字。

最后,如果你有一个奇数的数字,把最后一个数字放在开头或结尾,无论什么给出最大的差异。

示例:

7 3 4 5 5 7 6 8 5 4 -> [sort] -> 3 4 4 5 5 5 6 7 7 8 
high numbers: 5 6 7 7 8  
low numbers: 3 4 4 5 5  

Arranged:
5 3 6 4 7 4 7 5 8 5 = 24

示例:

9 2 5 3 1 -> [sort] -> 1 2 3 5 9
high numbers: 5 9
low numbers: 1 2
left over: 3

Arranged:
3 5 1 9 2 = 21       (3 goes at the start, because |3-5| > |3-2|)