你如何平衡一组项目?作为平衡,这 4 个变量中的每一个与任何其他变量的方差都不应超过 +1。
每个数字必须保持完整,因为它们代表 1 个要转移的实物。
Input a=1, b=2, c=3, d=10
Output a=4, b=4, c=4, d=4
Ouput:
Move 3 from d to a
Move 2 from d to b
Move 1 from d to c
Input a=1, b=2, c=0, d=0
Ouput a=1, b=1, c=1, d=0
Output:
Move 1 from b to c
Input a=1, b=0, c=0, d=0
Output a=1, b=0, c=0, d=0
Output:
Move None
Input a=0, b=1, c=0, d=1
Output a=0, b=1, c=0, d=1
Output:
Move None
不,这不是一组 if/else 语句。将您的值放入列表中,而不是单独的变量。取平均值,截断为整数。在另一个相同长度的列表中复制这个意思。你现在有类似的东西
vals = [1, 3, 4, 10]
mean = [4, 4, 4, 4]
请注意,您还剩下 2 件元素。你需要分发那些。
在均值列表中,将 1 加到任何超过均值的元素,直到用完剩菜或元素。你现在有
vals = [1, 3, 4, 10]
mean = [4, 4, 4, 5]
在这种情况下,您还剩下 1 个。将它添加到任何其他元素:
vals = [1, 3, 4, 10]
mean = [4, 5, 4, 5]
现在,比较列表,一次一个元素,并报告所需的移动是很平常的事情。这为您提供了最少数量的移动项目以获得所需的分配。
这会让你前进吗?
对OP评论的回应
首先,您的帖子要求的是余额,而不是所需的一系列转账。接下来,我看不出它有什么地方不是微不足道的。任何小于“均值”数组的都是接收者;更多的是捐助者。您永远不会多次移动产品:只需将转移限制在可用数量和所需数量中的较小者即可。
考虑一个简单但重要的案例:
vals = [1, 2, 10, 1, 6]
mean = [4, 4, 4, 4, 4]
diff = [-3, -2, 6, -3, 2]
您可以按任何顺序识别 Action ;为简单起见,我们将在两组中从右到左。是的,如果 E 将其多余的 2 件提供给 B,而 C 分别向 A 和 D 提供 3 件,则有一个简单的解决方案,但问题并不要求最少的出货量,只要求有效的元素移动数量。
A 有 1 个项目,但需要 4 个:从 C 中取出它们,第一个多余的元素,它有 6 个额外的元素。
vals = [4, 2, 7, 1, 6]
mean = [4, 4, 4, 4, 4]
diff = [0 -2, 3, -3, 2]
B 还需要 2 个元素,它也可以从 C 那里得到:
vals = [4, 4, 5, 1, 6]
mean = [4, 4, 4, 4, 4]
diff = [0, 0, 1, -3, 2]
D 还需要 3 个,但是 C 只剩下一个:接受它。
vals = [4, 4, 4, 2, 6]
mean = [4, 4, 4, 4, 4]
diff = [0, 0, 0, -2, 2]
...最后,最后的传输现在很明显了。
那会让您再次行动起来吗?