题目大意:
在直角坐标系中有一条抛物线
和一个点P(x,y),求点P到抛物线的最短距离d。
题解:
三分的典例
我们将最大区间定为[left, right],我们不断的三分枚举这个区间,直到最小。
首先将区间三分:mid=(left+right)/2; midmid=(mid+right)/2;(并非是严格的三等分)。我们比较calc(mid)与 calc(midmid)的值,来判断接下来的区间逼近过程该向哪个区间逼近。
#include<bits/stdc++.h>
#include<cstring>
#define ll long long
#define INF 1000000007
#define eps 1e-7
using namespace std;
int a,b,c,x,y;
double cal(double t)
{
double ans;
ans=a*t*t+b*t+c;
return ans;
}
double dis(double tmp)
{
double t=(tmp-x)*(tmp-x)+(cal(tmp)-y)*(cal(tmp)-y);
return t;
}
int main()
{
//freopen("input.txt","r",stdin);
double l,r,mid,mmid,midvalue,mmidvalue;
cin>>a>>b>>c>>x>>y;
l=-200.0;r=200.0;
while(l+eps<r)
{
mid=(l+r)/2;
mmid=(mid+r)/2;
midvalue=dis(mid);
mmidvalue=dis(mmid);
if(midvalue>=mmidvalue)
l=mid;
else r=mmid;
}
double ans=dis(l);
ans=sqrt(ans);
cout<<fixed<<setprecision(3)<<ans<<endl;
return 0;
}