弹簧和钩子

时间:2014-03-24 13:37:48

标签: algorithm language-agnostic puzzle

好的,

我正在处理一个我似乎无法解决的问题。一点帮助?

问题:给定长度为M的木线,其具有n个钩子,并且这些钩子的位置以阵列形式给出(0

假设:给定的数组始终有效。

您可以忽略垂直拉伸,仅考虑水平方向上弹簧的伸展。这个问题在本质上可以看作1D。

限制:此处寻求O(nlogn)或更好的解决方案。

示例: M = 10,数组= [4,4],R = 1(直径为2),最佳球位= [3,5]

到目前为止我已尝试过:

  • 一次拿一个钩子/球,如果两个球相互撞击,则创造一个球。将它们对称地放置在钩子的质心处。 瓶颈 O(n ^ 2)因为球互相撞击
  • 将所有球放在钩子的完整质心处。以递归方式返回最多3个子问题.. a)向左伸展的球,b)向右伸展的球,c)在其中间的球。 瓶颈 3个子问题可能有重叠并且重叠好看似乎很尴尬。 enter image description here

1 个答案:

答案 0 :(得分:1)

这是一种二元搜索,可以找到每个球的正确位置。

  1. 按照每个人可以去的最左边的连接顺序开始每个球的旁边。
  2. 计算球移动的空间(从最右边的球到右边缘的距离),并使用其中一半作为起始增量。
  3. 计算弹簧,其邻居和边缘的每个球上的净力。
  4. 将每个球沿着净力的方向移动,或者如果没有净力则将其保持在原位。
  5. 如果增量低于您想要的精度或所有球没有净力,请停止。否则,将增量除以2并转到步骤3.