【问题标题】:Multiple points in line with gaps between - Find minimum max move多个点与之间的间隙一致 - 找到最小最大移动
【发布时间】:2014-01-06 19:05:48
【问题描述】:

我们得到一个大小为N 的集合P,每个元素代表实线上的一个点。在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...

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

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

给出一个解决方案

    o     o     o     o     o
 ------------------------------
...-2 -1  0  1  2  3  4  5  6...

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

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

【问题讨论】:

  • 有什么限制吗?石头数还是点数?

标签: algorithm


【解决方案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。

【讨论】: