问题描述:
问题推导:
二分算法的的本质就是通过不断迭代使left 和 right 在固定条件下逐渐靠近真实值,符合一定误差,本题可以固定条件取为:凸多边形的外接圆的弧度为2π。
代码:
#include<cstdio>
/**
* 求弧度
**/
double getTotalRadian(double edges[],int n,double r)
{
double radian = 0.0,asinValue;
for(int i =0;i<n;i++)
radian+=asin(edges[i]/2/r)*2;
return radian;
}
/**
* 二分查找求最大半径
*/
void maxR()
{
//错误率
double error = 1e-5,p;
//边的个数
int n;
//边长数组
double edges[5000];
//弧度 最大边 π
double radian, maxEdge=0.0, pi = 3.1415926535 ;
//初始化edges
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lf",&edges[i]);
if(edges[i]>maxEdge)
maxEdge = edges[i];
}
//若最长边为直径,则直接处理
radian = getTotalRadian(edges,n,maxEdge/2);
if(abs(radian-pi*2)<error)
{
printf("外接圆的最大半径是:%.2f",maxEdge/2);
return ;
}
//左 中 右
double left =0,right=10000000,mid;
//在误差范围内循环求解
while(right -left >error)
{
mid = (right + left) /2;
radian = getTotalRadian(edges,n,mid);
if( radian > 2*pi)
left = mid;
else
right = mid;
}
printf("外接圆的最大半径是:%.2f",mid);
}