【问题标题】:Need some simple logic help, been stuck for a few hours需要一些简单的逻辑帮助,卡了几个小时
【发布时间】:2016-03-31 10:06:07
【问题描述】:

问题是要求取任意数量的数字,并找到连续数字之间可能的最大差异总和(使用绝对值)。例如,数字 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

任何帮助都将不胜感激,即使它只是为我指明了正确的方向。

【问题讨论】:

  • 你如何为9 2 5 3 1 获得21?不应该是14吗?
  • @Haris: 重新排列为 2 9 1 5 3,差异为 7 + 8 + 4 + 2 = 21。
  • @MOehm,好的。我以为他给了重新排列的那个。
  • 哦,抱歉,我作为样本提供的列表尚未排列,我需要找出算法来排列它们以产生最高总和。
  • 您的列表有多大?

标签: c logic


【解决方案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|)

【讨论】:

  • 非常感谢,这对您有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
相关资源
最近更新 更多