HihoCoder - 1142 三分法练手

中文题面,原函数为三峰函数,先折半再三分

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+11;
const int oo = 0x3f3f3f3f;
int a,b,c,x,y;
double C(double X){
	double Y=(double)a*X*X+b*X+c;
	return (X-x)*(X-x)+(Y-y)*(Y-y);
}
int main(){
	while(cin>>a>>b>>c>>x>>y){
		double l=-b/2/a,r=1e3;
		while(r-l>1e-4){
			double lm=l+(r-l)/3;
			double rm=r-(r-l)/3;
			if(C(lm)<C(rm)){
				r=rm;
			}else{
				l=lm;
			}
		}
		double ans=C(l);
		l=-1e3,r=-b/2/a;
		while(r-l>1e-4){
			double lm=l+(r-l)/3;
			double rm=r-(r-l)/3;
			if(C(lm)<C(rm)){
				r=rm;
			}else{
				l=lm;
			}
		}
		ans=min(C(l),ans);
		printf("%.3lf\n",sqrt(ans));
	} 
	return 0; 
} 
posted @ 2018-03-23 01:37  Caturra  阅读(148)  评论(0编辑  收藏  举报