python - 您如何分配整数列表以尽可能接近平衡?

标签 python algorithm

<分区>

你如何平衡一组项目?作为平衡,这 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]

...最后,最后的传输现在很明显了。

会让您再次行动起来吗?

关于python - 您如何分配整数列表以尽可能接近平衡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42868457/

相关文章:

python - 在 Pandas 中按组保留 X% 的最后一行

python - 使用Python使用广度优先搜索算法的两个节点之间的距离

javascript - 按层次结构和名称对具有层次结构的对象数组进行排序

java - 算法:将 y 个球放入 x 个盒子中,其中 x <= y

php - PHP 中的计数排序

ruby - 用两个数组确定一手扑克牌

python - 如何在AWS lambda上导入opencv模块

python - NumPy C-API : convert type object to type number

python - 强制 qcut 分成等概率的组

java - java for循环内递归的时间复杂度