N个线段求最大外接圆半径
题目
给出N个线段的长度,试将他们头尾相接(顺序任意)地组合成一个凸多边形,使得该凸多边形的外接圆(即能使凸多边形的所有顶点都在圆周上的圆)的半径最大,求该最大半径。其中N不超过10^5,线段长度均不超过100,要求算法中不涉及坐标的计算。
思路
二分算法
的本质就是通过不断迭代使left 和 right
在固定条件下逐渐靠近真实值,符合一定误差,所以实际上把该题放在二分扩展里面,这个所谓的最大半径的“最大”不应该是用函数来求解,最大应该是考虑如何找到这个最大的半径。所以先组成一个有外接圆的凸多边形,然后求其半径即可。不要误入歧途在“最大”上绞尽脑汁。
外接圆圆心与每个线段顶点连接后会有一个圆心角,如果圆心在凸多边形内部,则所有圆心角之和应该为2π。如果圆心在凸多边形外部,则最大的圆心角等于其他圆心角之和。
因此设定初值,求出每个线段对应的圆心角,使所有圆心角之和等于2π。不断迭代逼近真值即可。当所求圆心角大于2π时,增大r尝试,小于2π时,缩小r尝试。
当圆心在多边形外面时,取圆心角之和为其他圆心角 + 2π -
最大圆心角,同时逼近的方向与前面相反。半径应该大于等于最大边的一半。其中等于的情况单独处理。
代码
1 |
|