2020牛客竞赛
链接:https://ac.nowcoder.com/acm/contest/3006/B
来源:牛客网
可以知道,在数轴上选点,会形成一个下凸形(左边单调递减,右边单调递增)
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 struct p{ 5 int x,y; 6 }a[100005]; 7 int n; 8 double check(double x) 9 { 10 double max=0; 11 for (int i=1;i<=n;i++){ 12 double tmp=sqrt(a[i].y*a[i].y+(a[i].x-x)*(a[i].x-x)); 13 if (tmp>max) max=tmp; 14 } 15 return max; 16 } 17 double tsearch(double left,double right){ 18 int i; 19 double mid,midmid; 20 for(i=0;i<100;i++){ 21 mid=(left+right)/2; 22 midmid=(mid+right)/2; 23 if(check(mid)>check(midmid)) //极大值求法 24 left=mid; 25 else 26 right=midmid; 27 } 28 return mid; 29 } 30 int main() 31 { 32 scanf("%d",&n); 33 for (int i=1;i<=n;i++) 34 scanf("%d%d",&a[i].x,&a[i].y); 35 double max=tsearch(-10000,10000); 36 printf("%.4lf\n",check(max)); 37 return 0; 38 }