我有三个桶。它们不含相同数量的水,每个最多可容纳 50 升。
现在我想往桶里加更多的水。这个数量可能会不时变化,也可能超过 50 x 3 升。我的目标是用新水装满水桶,使每个水桶中的水量大致相等 - 尽可能接近相等,但这不是标准。并且不超过50的上限。
是否有一种简单易读的算法可以平衡(尽可能多地)水桶中的水量?
- 我总是知道每个桶里已经有多少水。
- 我总是知道我得到了多少新水。
- 已经装在桶里的水不能碰
- 等水位不是标准,但最好远离限制
uj5u.com热心网友回复:
是的,有一个简单的算法如下:
- 按水量对水桶进行分类。让我们称它们
a, b, c
为非递减排序的。 - 你需要平衡它们的总水量是
(c - b) (c - a) = 2*c - b - a
。让我们呼叫所需的数量t
。 - 如果可用水小于
t
,则无法平衡水桶。 - 否则,添加
c - b
tob
和c - a
toa
。
根据编辑中的新约束进行更新:
如果您有足够的水将装得较少的水桶中的水量增加到装得较多的水桶的水位,那么前面的算法就可以正常作业。
但如果没有足够的水使三个都相等(请注意,这可以如上所述预先计算),首先用最少量的水填充桶,直到它等于中间的水。然后分配剩余的可用水量,并将其平均分配到两个相同但水量比另一个少的水桶之间。
直觉是这样的:当您添加到最小的桶直到到达中间的桶时,每增加一升,您将三者之间的绝对差减少 2。那是因为最小的接近中间和最大的。
例子:
a, b, c = 5, 3, 1
available_water = 4
difference = (5 - 3) (5 - 1) (3 - 1) = 8
add 2 to the smallest:
a, b, c = 5, 3, 3
available_water = 2
difference = (5 - 3) (5 - 3) (3 - 3) = 4
Note that we reduced the difference by 2 times the amount of used water
add 1 to each of the smaller buckets:
a, b, c = 5, 4, 4
available_water = 0
difference = (5 - 4) (5 - 4) = 2
Now if we didn't follow this algorithm and just arbitrary used the water:
add 2 to the middle bucket:
a, b, c = 5, 5, 1
available_water = 2
difference = (5 - 5) (5 - 1) (5 - 1) = 8
add 2 to the smallest one:
a, b, c = 5, 5, 3
available_water = 0
difference = (5 - 5) (5 - 3) (5 - 3) = 4
0 评论