三分法 求最大值最小|牛客寒假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;
}
posted @ 2020-02-14 19:43  fishers  阅读(230)  评论(2编辑  收藏  举报