当前位置: 首页 > 知识库问答 >
问题:

使列表中每个位置的硬币数量相等所需的最小硬币移动次数

丌官积厚
2023-03-14

给出了一个大小为n的数组coin,其中coin[i]表示位置i处的硬币数量。“移动”包括将一定数量的硬币从位置i移动到位置i+1i-1。重新分配硬币所需的最小移动次数是多少,这样每个位置上正好有一枚硬币?你被保证有相同数量的硬币与有的插槽,以分配他们。

例如,给定输入

 [3, 0, 0, 0, 3, 0, 1]

输出为

[1, 1, 1, 1, 1, 1, 1]
    null

解决这个问题的有效方法是什么?

共有1个答案

曹高阳
2023-03-14

你只需扫描内部边框,并计算需要转移的边框。这个计数是移动的最小数目。

找到这个最小值的Python代码:

def nb_moves(game):
    N=len(game)-1 # number of inside borders.
    sum = -1
    for i in range(N):
        sum += game[i]
        if i == sum : N -= 1 # no transfer needed between cells i and i+1 . 
    return N

实际上,让n是这个计数。n显然是移动次数的最小值。此外,可以达到这一最低限度:

如果有必须两边清空的单元格,则首先这样做:两个边框分两步处理,将块切割成两个平衡的块,并将一个单元格设置为1。

剩下的块是单调的,可以从左到右或者从右到左求解。

这样,每个内部边界只跨越一次,而且只能跨越一次。

In [275]: solve([3, 0, 0, 0, 3, 0, 1])
Out[275]: 4

In [276]: solve([2,2,0,0])
Out[276]: 3

In [277]: solve([1,2,0,1])
Out[277]: 1
 类似资料:
  • 具体而言,问题是: 给定面额数组<代码>硬币[],每个硬币的限制数组<代码>限制[]和数量<代码>金额,返回所需的最小硬币数量,以获取<代码>金额,或者如果不可能,返回空值。另外,用溶液中使用的每个硬币的数量填充数组 这是我的解决方案: 但它一般不起作用。 我的问题是,例如,在这种情况下: 最佳解决方案是: 并且我的算法给出作为结果。换句话说,它失败了,每当在某种情况下,我将不得不使用比可能的更少

  • 给定一个硬币面额列表,我需要找到获得给定价值所需的最低硬币数量。 我使用贪婪算法的方法, 将值除以最大值,取余数值,再除以第二个最大值,依此类推,直到得到所需值。 但是这种方法在某些情况下失败了。 我很想知道 适用于所有情况的方法 方法失败的例子。 硬币面额(1,3,4,5) 所需值7 使用贪婪方法 (7/5)=1和2因为3和4不能使用,所以我们需要使用2 1的价值硬币。所以总共3个硬币。 然而,

  • 所以我对编码不熟悉,我得到了一个任务,我需要做一个程序,用四分之一、一角、五分和一美分给不到一美元的零钱。然而,作业希望程序打印所需的最低硬币数量(例如,如果我输入58美分,那么输出应该是“2个25美分,1个镍和3个便士”,而不是“2个25美分,0个10美分,1个镍和3个便士”。本质上,如果没有某种硬币,那么程序就不应该打印它)。我一直在想如何制作它,这样程序就不会打印任何不必要的硬币。 这就是我

  • 在研究硬币更换问题后,我尽力实施解决方案。到目前为止,我的代码打印了给定金额所需的最低硬币数量。然而,它并不打印出每种硬币面额所需的数量。这是我的代码目前的样子: 我只是很困惑如何/在哪里填充numOfCoins[]。

  • 下面是最小硬币变化问题的蛮力解决方案。它需要一个int更改,也就是需要进行的更改,以及一系列硬币面值。它返回进行更改所需的最低硬币。 我如何修改它以同时返回一组硬币? 例如,如果要求给出值为[1,2,5]的10美分的零钱,它应该返回2个硬币分钟和一个数组[0,0,2]的2个硬币。

  • 我正在尝试打印最小数量的硬币来进行更改,如果不可能,请打印-1 在这段代码中,变量int[]c(硬币数组)有面额,我可以用它来计算总金额。 INT总有总和,我需要拿出使用硬币(无限供应) 对于Sum:4759和Array:{3190836},正确的输出是:59,我的输出是:60 代码中有什么错误? 下面是我的递归解决方案,尝试在DP解决方案中应用相同的逻辑。这里的逻辑似乎也有问题。对于相同的输入,