给定一组< code>n点< code>(a_1,b_1),< code>(a_2,b_2),...,< code>(a_n,b_n)。需要找到最小的< code>x,使得三个长度为< code>x的< code >轴平行正方形一起覆盖所有的点。
我可以找到包含所有点的最小面积的矩形。这个矩形可以以某种方式使用吗?或者任何关于如何处理这个问题的提示?
@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?
至于二分搜索法,我真的不能说它会多快收敛到只允许一个正方形排列的范围,在这一点上,你可以直接计算值< code>x -我希望以任意的精度,你可以任意地变坏。每次迭代需要O(n log n)来对两个基本方向上的点进行排序。
我认为,考虑两种情况就足够了:
在第一种情况下,我们可以将一个正方形的角点固定在四个矩形角点中的一个角点上,然后将其他两个正方形的角点固定在矩形的两个相对(选定角点)边的某处(n
每个角点的可能位置),然后为每个点确定它所属的最佳正方形和最小x
。
在第二种情况下,尝试两对相反的矩形角来表示“外部”正方形,然后将“内部”正方形的一个角固定在所有由所有x
和y
点坐标确定的所有n * n
个位置,然后为每个点确定它所属的最佳正方形和最小x
。
时间复杂度为O(n3)。
将求解第一个点的第一个圆放置在适当位置。 通过检查这两个点之间的距离是否小于2*r来求解最小圈数中的第二个点。并继续处理所有n个点。我认为是贪婪算法,但它是最优的,线性的吗?
这应该是正确的:
这个问题出现在一个挑战中,但由于它现在已经关闭,询问它应该是可以的。 问题(不是这个问题本身,这只是背景资料)可以这样直观地描述,借用他们自己的形象: 我选择了最优解决。这可能是(对于决策变体)一个NP完全问题(它肯定是在NP中,而且它闻起来像一个精确覆盖,尽管我还没有证明一个一般的精确覆盖问题可以简化为它),但那很好,它只需要在实践中快速,而不一定是在最坏的情况下。在这个问题的背景下,我对任何近
已经有一段时间了,我一直被这个困扰着#新手开发者 我正在制作一个圆形进度条。问题是动画圈没有利用进度条的可用空间。 屏幕截图应该解释这个问题。 蓝色的不完整圆圈是圆形进度条。黄色方块是进度条的背景。红色箭头是未使用的空间,这是值得关注的问题。 progressbar和背景的大小通过代码设置。我想让圆形进度条使用整个空间。 比赛活动。JAVA activity_race_live.xml circu
一个圆覆盖一个点,如果该点位于圆内。如果一个点与圆心的距离小于或等于r,则该点位于圆内。
给定一个点集S,要求用2个固定半径r的圆复盖最大数目的点。通过考虑距离小于2r的每对点,可以计算出一个圆盘所能覆盖的最大点数。通过一对点可以构造2个圆。从所有这样的组合中,选择覆盖最大点的圆和覆盖第二最大点的圆。但它会给出最优答案吗,还是这种方法要做一些改变呢?