1. 程式人生 > >1142 三分·三分求極值

1142 三分·三分求極值

題目大意:

在直角座標系中有一條拋物線 y=ax^{2}+bx+c和一個點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;
}