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

Algorithm 找到相邻硬币移动的最小数量?,algorithm,puzzle,Algorithm,Puzzle,给出了一堆硬币(例如5堆:9,0,5,1,5),总共20枚硬币。。所需的最小移动次数,以使所有堆具有相等数量的硬币(4,4,4,4)(此处的ans为9次移动)规则:一枚硬币只能移动到相邻堆中,即。第j堆硬币可以移动到j-1或j+1(如果存在) 有什么好的解谜算法吗?所有桩尺寸的算术平均值给出每个桩的所需尺寸,让它为d,而桩数为n。让我们首先假设,在构造解决方案时,有时会出现负大小的堆,我们将在稍后修正该假设 O(n)算法如下-让我们看看第一堆。如果它的大小是d,那么我们既不想改变它的大小,也不想

给出了一堆硬币(例如5堆:9,0,5,1,5),总共20枚硬币。。所需的最小移动次数,以使所有堆具有相等数量的硬币(4,4,4,4)(此处的ans为9次移动)规则:一枚硬币只能移动到相邻堆中,即。第j堆硬币可以移动到j-1或j+1(如果存在)


有什么好的解谜算法吗?

所有桩尺寸的算术平均值给出每个桩的所需尺寸,让它为d,而桩数为n。让我们首先假设,在构造解决方案时,有时会出现负大小的堆,我们将在稍后修正该假设

O(n)算法如下-让我们看看第一堆。如果它的大小是d,那么我们既不想改变它的大小,也不想让硬币穿过其他的硬币堆,因为左边没有硬币堆。这意味着最优解决方案中的任何移动都不会改变这一堆的大小,我们可以忘记它。然而,如果第一堆硬币的大小是d'>d,那么我们知道我们想从中取出(d'-d)硬币。因为它们只能走一条路——向右,我们可以这样做,将第一堆减少到d,然后像以前一样忘记它。类似地,如果d' 由于我们忘记了第一堆,我们可以想象我们删除了它,而第二堆现在是第一堆。我们通过所有的堆继续这个过程,当移动一些硬币时,我们将这些移动添加到一些计数器

有一个问题是左-负桩。让我们列出我们在解决方案中执行的所有操作,很容易看出执行顺序并不重要。我们唯一可以做一些非法的事情的是当我们把硬币从一堆(i+1)拿到一堆(i+1)时,可能留下了(i+1)负数。这意味着后来我们从(i+2)到(i+1)取了一些硬币来补偿它,如果这个动作是在从(i+1)取下之前完成的,那么(i+1)的大小永远不会是负数。因此,如果我们从最右边开始执行预定的移动,一切都会很好-这证明构造的解决方案是有效的