问题描述
对于一个凸函数。
http://hihocoder.com/contest/hiho40/problem/1
解法
先确定搜索范围,【-
∞
,
−b/2a
】 还是【
−b/2a
,+
∞
】;
然后不断缩减区间直到结果符合要求。
#include <bits/stdc++.h>
using namespace std;
double a, b, c, x, y;
double dis(double X)
{
double deltY = (a*X*X +b*X+c-y);
double deltX = X-x;
return sqrt(deltX*deltX + deltY*deltY);
}
int main()
{
cin>>a>>b>>c>>x>>y;
double L, R;
double k = -1.0*b/a/2.0;
if (x>= k)
{
L = k;
R = k+1e9;
}else{
L = k-1e9;
R = k;
}
for(int i=0; i<100; ++i){
double m = (R-L)/3.0;
double lm = L+m;
double rm = R-m;
if (dis(lm) < dis(rm))
{
R = rm;
}else
L = lm;
}
printf("%.3f\n", dis(R));
return 0;
}
%.3f 是输出四舍五入后的结果。