给定一组n
分(a_1, b_1)
,(a_2, b_2)
,...,(a_n, b_n)
。需要找到最小x
,以便每个长度axis parallel
的三个x
正方形一起覆盖所有点。
我可以找到包含所有点的最小区域的矩形。这个矩形能以某种方式使用吗?或者有关如何解决这个问题的任何提示?
答案 0 :(得分:3)
我认为,考虑两种情况就足够了:
在第一种情况下,我们可以将一个正方形的角固定在4个矩形角的一个角上,然后将其他两个正方形的角固定在矩形的两个相对(到选定的角)边缘的某处(n
每个点的可能位置,然后为每个点确定它所属的最佳平方和最小x
。
在第二种情况下,尝试两对相对的矩形角,用于"外部"正方形,然后修复"内部"的一个角落。由所有n*n
和x
点坐标确定的所有y
位置上的平方,然后为每个点确定其所属的最佳平方和最小x
。
时间复杂度为O(n 3 )。
答案 1 :(得分:2)
@EvgenyKluev的答案似乎朝着正确的方向发展,但我想解决一些微妙之处。
由于我没有看到x
为整数的限制,您可能希望在x
上使用二进制搜索来指导您的算法,并在范围仍然时找到合适的终止条件可用于x
的数量足够小(您也可以对整数x
进行二分搜索,但是您不需要终止条件)。
在矩形的一个角落放置一个正方形(你必须做的事情,有点直接证明)会限制你的搜索空间以放置另外两个正方形:让A成为所涵盖的点集合角对齐的第一个方块,让S成为所有点的集合。取S-A并找到该组点的包围矩形。将剩下的两个正方形放置在S-A的封闭矩形的相对角上将始终是一个解决方案(只有一对相对的角可能适合),如果存在的话。
因此,一个算法可以 - 非常高的水平 - 像这样
binary search for x on [0,N]:
find R(S), the enclosing rectangle of S
for each corner C of R(S):
align one square at C, let the points covered by that square be A
find R(S-A)
do two squares aligned at opposite corners of R(S-A) cover S-A?
对于二分搜索,我真的不能说会收敛到只允许一个正方形对齐的范围有多快,此时你可以直接计算值x
- 我期待任意精度,你可以任意不好。每次迭代都需要O(n log n)来对两个基本方向上的点进行排序。