三分法 求最大值最小|牛客寒假5-B牛牛战队的比赛地
最大值最小
很容易想到二分,但是二分没思路。
所以再想到三分,最大值最小,就是在最大值函数中找极小值,所以可以用三分
这里三分的应用判别场景是:可以发现最大距离的最小值随x的变化会出现一个极值。所以二分所在的横坐标x,check(x)求最大距离,三分不断缩小区间
#include<bits/stdc++.h>
using namespace std;
int n;
const int maxn = 100010;
const double eps = 1e-5;
struct node{
double x,y;
}a[maxn];
double check(double x){
double maxx = -0x3f3f3f3f;
for(int i=1;i<=n;i++){
maxx = max(maxx,sqrt((a[i].x - x)*(a[i].x - x) + a[i].y * a[i].y));
}
return maxx;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y;
double l = -10000;
double r = 10000;
while(l + eps < r){
double mid = (l + r)/2;
if(check(mid - eps) > check(mid + eps))
l = mid;
else
r = mid;
}
printf("%.4lf",check(l));
return 0;
}