1125: 越野车大赛
Time Limit: 500 MS Memory Limit: 64 MB Special Judge
Submit: 4 Solved: 3
[Submit][Status][Web Board]
Description
TheBeet正在参加一场越野车大赛。比赛的场地如右图:
共分三块,每一块地面的长宽均为N与M,但地表情况不同,越野车在这段路面上的最高速度也不同。
蓝色线表示TheBeet可能的行车路线。
比赛的要求是要求选手从比赛的场地左上角驾车至右下角。TheBeet想知道如果他在所有路段都以最快速度行驶(不考虑加速阶段),最快能在多少时间内完成比赛。
Input
输入数据的第一行为两个正整数N M(N<=3000,M<=1000),表示一块路面的长和宽。
第二行为三个正整数S1,S2,S3(0<S1,S2,S3<=100),从上至下依次表示各个路面上越野车的最高速度。
Output
输出一个实数表示TheBeet最快能在多少时间内完成比赛。请输出一个尽可能精确的数字,控制误差在±0.000001的内。
Sample Input
30 10
2 5 3
Sample Output
13.7427361525
HINT
如果你的输出和结果的相差在0.000001之内,则认为是正确答案。
题解:二元函数用到了三次三分。。。
代码:
//f(x,y) =sqrt(x*x+M*M)/S1+sqrt(y*y+M*M)/S2+sqrt((N-x-y)*(N-x-y)+M*M)/S3;
#include<stdio.h>
#include<math.h>
#define MIN(x,y)(x<y?x:y)
int N,M;
int s1,s2,s3;
double gett(double x,double y){
return sqrt(x*x+M*M)/s1+sqrt(y*y+M*M)/s2+sqrt((N-x-y)*(N-x-y)+M*M)/s3;
}
double sanfen(double l,double r,double mid){
double m,mm;
while(r-l>1e-){
m=(l+r)/;
mm=(m+r)/;
if(gett(mid,m)<gett(mid,mm))r=mm;
else l=m;
}
return gett(mid,l);
}
int main(){
while(~scanf("%d%d",&N,&M)){
scanf("%d%d%d",&s1,&s2,&s3);
double mid,midmid;
double ans1,ans2;
double l=,r=N;
while(r-l>1e-){
mid=(l+r)/;midmid=(mid+r)/;
ans1=sanfen(,N,mid);
ans2=sanfen(,N,midmid);
if(ans1<ans2)r=midmid;
else l=mid;
}
printf("%.10lf\n",sanfen(,N,l));
}
return ;
}