三分法 求最大值最小|牛客寒假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;
}

猜你喜欢

转载自www.cnblogs.com/fisherss/p/12309217.html