我们给出了P
大小为N
的集合,每个元素代表实线上的一个点。在p
中的每个点P
,放置了一堆m(p)
石块。我们想移动石头,使它们全部分开最小距离d
,目标是尽量减少任何石块移动的最大距离。
示例:有N = 3
个点和P = {1, 2, 3}
。 m
定义为
m(1) = 2
),m(2) = 1
),m(3) = 2
)。可以像这样描绘:
o o
o o o
----------------
...0 1 2 3 4...
如果最小间隙大小为2,则此示例的最佳解决方案是
给出了解决方案
o o o o o
------------------------------
...-2 -1 0 1 2 3 4 5 6...
这意味着任何石头的最大行进距离为3.
不幸的是,我想不出一个计算这个数字的好方法,还没有在互联网上找到一个! 先感谢您。
答案 0 :(得分:1)
给定最小的最大距离x,很容易检查是否有有效的解决方案。从x = floor(max(m)/ 2)* d开始。
对于最左边的点,向左移动x / d石头。如果有少于x / d的宝石,请将所有宝石移动到最左边的可能点(x,x-d等)。如果有超过x / d的宝石,请将它们移到右边。
对于第二个最左边的点,向左移动尽可能多的点,向右移动提醒,依此类推。如果在任何时候,都不可能放置石头,则x无效。
下一步是对最佳x执行二进制搜索。如果x是一个整数,则需要重复此操作log(x)次。
其他选择可能是在陷入僵局时推断下一个可能的值。示例:在给定点,如果仍有k个宝石没有空间,可能需要将x增加至少k / 2.