三分去逼近一个凹/凸函数,很好的思想!这题要注意的是,循环终止的条件是,取的这两个点足够近(不是x坐标足够近)。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <math.h>
#include <stack>
using namespace std;
const double eps = 1e-4;
double a,b,c,x,y;
double dist(double x1,double y1,double x2,double y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double getY(double xx){
return a*xx*xx+b*xx+c;
}
double calc(double xx){
double yy = a*xx*xx+b*xx+c;
return dist(xx,yy,x,y);
}
int main(){
while(cin>>a>>b>>c>>x>>y){
double l=-10000;
double r= 10000;
double lres,rres;
while(dist(l,getY(l),r,getY(r))>eps){
double d=(r-l)/3;
double lmid=l+d;
double rmid=r-d;
lres=calc(lmid);
rres=calc(rmid);
if(lres<rres){
r=rmid;
}else{
l=lmid;
}
}
double ans=calc((l+r)/2);
printf("%.3f\n",ans);
}
return 0;
}