//二分答案,注意精度只需要满足1e-5,无需跟sample一样也可AC //题意是求一个点(x,0)使得其他点到它的最大距离最小 #include<iostream> #include<cmath> using namespace std; struct coord { double x,y; }A[50005]; double ans,l,r,mid,X; int ansP,n; const double eps = 1e-6;//精度设置 void cal(double mid) { ans = 0; for(int i = 0;i < n;++i)//将枚举的答案mid代入所有点中计算最长的距离 { double dis = sqrt((A[i].x-mid)*(A[i].x-mid)+A[i].y*A[i].y); if(dis > ans) { ans = dis; ansP = i; } } } int main() { //freopen("in.txt","r",stdin); while(scanf("%d",&n) && n) { ansP = 0;//任意选取一个点,ansP是点的数组下标 l = 500000; r = -500000; for(int i = 0;i < n;++i) { scanf("%lf%lf",&A[i].x,&A[i].y); if(A[i].x < l) l = A[i].x; if(A[i].x > r) r = A[i].x//寻找左右边界l,r } while(l <= r) { mid = (l+r)/2; double dis = sqrt((A[ansP].x-mid)*(A[ansP].x-mid)+A[ansP].y*A[ansP].y); cal(mid);//以mid作为答案进行计算 if(fabs(l - mid) < eps) break;//满足精度条件则跳出 if(A[ansP].x > mid)//下面3行是二分的关键 l = mid; else r = mid; } printf("%.9lf %.9lf/n",mid,ans); } return 0; }