题目链接:https://ac.nowcoder.com/acm/problem/201956
题意:
题解:由于坐标在x轴上,可以假定当前有一个x0使得最大的距离最小,那么当x0往左移或往右移时最大的距离就会变大,因此可以把它看成一个先减后增的函数,套用三分的模板即可。
三分证明参考:https://blog.csdn.net/xu0_zy/article/details/79417463
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
double eps=1e-7;
const int maxn=1e5+10;
int n;
double a[maxn][2];
double f(double x){
double ans=0;
for(int i=0;i<n;i++){
double x1=a[i][0],y1=a[i][1];
ans=max(ans,sqrt((x-x1)*(x-x1)+y1*y1));
}
return ans;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i][0]>>a[i][1];
double l=-10000,r=10000;
while(l+eps<r){
double mid=(l+r)/2;
double midr=(mid+r)/2;
if(f(mid)>f(midr)) l=mid;
else r=midr;
}
printf("%.6f",f(l));
return 0;
}