多个点与两者之间的间隙一致 - 找到最小最大移动

Epi*_*mon 5 algorithm

我们给出了一组P大小N,每个元素代表实线上的一个点.在每个点p上P,m(p)放置一堆石头石头.我们想要移动石头使它们全部分开最小距离d,目标是尽量减少任何石头移动的最大距离.

示例:N = 3有点,和P = {1, 2, 3}.m是这样定义的

  • 在1,有两块石头(m(1) = 2),
  • 在2有一块石头(m(2) = 1),
  • 3有两块石头(m(3) = 2).

这可以像这样描绘:

      o     o
      o  o  o
 ----------------
...0  1  2  3  4...
Run Code Online (Sandbox Code Playgroud)

如果最小间隙大小为2,则此示例的最佳解是

  • 将一块石头从1移动到0
  • 将一块石头从1移动到-2
  • 从3到4移动一块石头
  • 从3到6移动一块石头

这提供了一个解决方案

    o     o     o     o     o
 ------------------------------
...-2 -1  0  1  2  3  4  5  6...
Run Code Online (Sandbox Code Playgroud)

这意味着任何石头的最大行进距离为3.

不幸的是,我想不出一个很好的方法来计算这个数字,还没有在互联网上找到一个!先感谢您.

ElK*_*ina 1

给定最小最大距离 x,很容易检查是否存在有效的解决方案。从 x = 楼层(max(m)/2)*d 开始。

对于最左边的点,向左移动 x/d 颗棋子。如果棋子少于 x/d,则将所有棋子移动到最左边的可能点(x、xd 等)。如果有超过 x/d 个棋子,请将它们移到右侧。

对于第二个最左边的点,将尽可能多的点向左移动,并向右移动提醒,依此类推。如果在任何时候都无法放置棋子,则 x 无效。

下一步是执行二分搜索以获得最佳 x。如果 x 是整数,则需要重复此操作 log(x) 次。

另一种选择是在出现僵局时推断下一个可能的值。示例:在给定点,如果仍有 k 个石头没有空间,则可能需要将 x 增加至少 k/2。