我在家庭作业中遇到问题,我需要找O(n.log(n))
贪婪算法,用于与平面中所有圆相交所需的最小行数,如下例所示。
所有行的起点是(0,0)
,它是原点。集C
包含n
个圆圈,其中每个圆圈c_i
都包含有关其半径r_i
及其中心坐标(x_i, y_i)
的信息。
我试过制定贪婪的规则:
C
中的每个圈子并选择c_i
origin
到c_i
的3条线,其中2条线是仅与圆中的1个点相交的切线,1条线是通过其中心穿过圆的正割线。 / LI>
c_j (j != i)
并查看与这些行相交的圈数L_i
并从平面中删除与其相交的圆圈。但我不认为这个贪婪的规则会达到最佳解决方案,其复杂性不会是O(n.log(n))
。
任何提示或完整解决方案都可以。问题表中还提到,给出minimum + 1
行的贪婪规则很好。
答案 0 :(得分:1)
此问题看起来像“按点覆盖细分”。您可以谷歌搜索或查看此处https://medium.com/competitive/covering-segments-by-points-fc2c56c4b038。在您的情况下,而不是段,您的每个圆圈都有角度。和线而不是点。
唯一的区别是细分不是在一条线上而是在一条圆上。这就是为什么你的回复中允许你额外的一行可以任意选择一个起点。
答案 1 :(得分:0)
由于您可以使用超过最小值的一行,因此您可以从任意行开始。顺时针继续逐行,直到所有圆相交。只要在它们之间没有圆圈,每条新线应该具有与最后一条最大的角度。您找到的2条切线对于查找每个步骤可以走多远很有用,但检查每个步骤的每个圆圈都会非常耗时。看看你是否可以弄清楚如何加快它。