(hiho一下)三分·三分求极值

来源:互联网 发布:apm软件 编辑:程序博客网 时间:2024/05/01 07:56


Link:http://hihocoder.com/contest/hiho40/problem/1


时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

这一次我们就简单一点了,题目在此:

在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d。

提示:三分法

输入

第1行:5个整数a,b,c,x,y。前三个数构成抛物线的参数,后两个数x,y表示P点坐标。-200≤a,b,c,x,y≤200

输出

第1行:1个实数d,保留3位小数(四舍五入)

样例输入
2 8 2 -2 6
样例输出
2.437
EmacsNormalVim




解题思路:三分法

AC  code:

#include<iostream>#include<stdio.h>#include<map>#include<vector>#include<set>#include<cstdlib>#include<string.h>#include<algorithm>#include<cmath>#define MAXN 1000010#define EPS 1e-9using namespace std;double a,b,c,x2,y2,x1,t;double ans;double fun(double x){return sqrt((x-x2)*(x-x2)+(a*x*x+b*x+c-y2)*(a*x*x+b*x+c-y2));}double san(double left,double right){double l,r,m,mm;l=left;r=right;while(r-l>EPS){m=(l+r)/2;    mm=(m+r)/2;if(fun(m)<fun(mm)){r=mm;}else{l=m;}}return l;}int main(){while(scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&x2,&y2)!=EOF){t=-b/(2*a);if(x2>=t){x1=san(t,t+500);ans=fun(x1);}else{x1=san(t-500,t);ans=fun(x1);}printf("%.3lf\n",ans);}return 0;}


总结:

1.求极小值时三分代码:

double san(double left,double right){double l,r,m,mm;l=left;r=right;while(r-l>EPS){m=(l+r)/2;    mm=(m+r)/2;if(fun(m)<fun(mm)){r=mm;}else{l=m;}}return l;}

2.求极大值时三分代码:

double san(double left,double right){double l,r,m,mm;l=left;r=right;while(r-l>EPS){m=(l+r)/2;    mm=(m+r)/2;if(fun(m)>fun(mm))//与求极小值时相反,这边改为大于号“> ”即可 {r=mm;}else{l=m;}}return l;}


         

        

       

0 0
原创粉丝点击