找到相邻硬币移动的最小数量?

时间:2014-07-19 20:47:00

标签: algorithm puzzle

给出成堆的硬币(例如5桩:9,0,5,1,5)总共20个硬币。最小的没有。所需的移动所以所有桩都有相同的硬币(4,4,4,4,4)(这是9次移动)规则:一枚硬币只能移动到相邻的桩上。第j堆硬币如果存在则可以移动到j-1或j + 1。

任何解决难题的好算法?

1 个答案:

答案 0 :(得分:1)

所有桩的尺寸的算术平均值给出了每个桩的理想尺寸,让它为d,而桩的数量为n。让我们首先假设比构建解决方案时我们有时会有一堆负面大小,我们将在一瞬间修复这个假设。

O(n)算法如下 - 让我们看看第一堆。如果它的大小为d,那么我们既不想改变它的大小,也不想通过它的其他桩传递硬币,因为左边没有桩。这意味着在最佳解决方案中的任何移动都不会改变这个桩的大小,我们可以忘记它。然而,如果第一桩的尺寸是d'> d,然后我们知道我们想从中删除(d' - d)硬币。因为他们只能走一条路 - 在右边,我们可以做到,把第一堆减少到d,并像以前一样忘掉它。同样,如果d'< d,然后在某个时间点,我们将不得不从第二堆中取出一些硬币,所以我们这样做了,忘记了第一堆。

当我们忘记第一堆时,我们可以想象我们删除了它,第二堆现在是第一堆。我们通过所有桩进行这个过程,当移动一些硬币时,我们将这些移动添加到某个柜台。

还有一个问题 - 负面堆积。让我们列出我们在解决方案中所做的所有操作,很容易看出我们执行的顺序无关紧要。我们可能做出非法行为的唯一举动是当我们从桩(i + 1)中取硬币到堆i时,可能已经离开(i + 1)为负。这意味着稍后我们从(i + 2)到(i + 1)取一些硬币来补偿它,如果这个移动在移动之前完成(i + 1)那么(i + 1)的大小永远不会消极。因此,如果我们从最右边开始执行预定的移动,一切都会好的 - 这证明构造的解决方案是有效的。