题目连接:http://acm.bnu.edu.cn/v3/contest_show.php?cid=6129#problem/A
三分:需要选择两个点,其中一个是中点,另一个是与中点相邻的点,进行比较。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps=0.00001;
int n;
struct point
{
double x;
double y;
}p[50050];
double dis(point m,double n)
{
return sqrt((m.x-n)*(m.x-n)+m.y*m.y);
}
double Max(double m)
{
double M=dis(p[0],m);
for(int i=1;i<n;i++)
{
if(dis(p[i],m)>M)
M=dis(p[i],m);
}
return M;
}
double sanfen(double l,double r)
{
while(r-l>eps)
{
double mid=(l+r)/2.0;
double midd=(mid+r)/2.0;
if(Max(mid)<Max(midd)) r=midd;
else l=mid;
}
return Max(l)<Max(r)?l:r;
}
int main()
{
double left=-200020,right=200020;
//int n;
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
double ans=sanfen(left,right);
double cnt=Max(ans);
printf("%.9lf %.9lf\n",ans,cnt);
}
return 0;
}