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

时间:2014-01-06 19:05:48

标签: 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...

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

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

给出了解决方案

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

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

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

1 个答案:

答案 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.