xmu1125 越野车大赛(三分)
1125: 越野车大赛
Time Limit: 500 MS Memory Limit: 64 MB Special JudgeSubmit: 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之内,则认为是正确答案。
题解:二元函数用到了三次三分。。。
代码:
1 //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; 2 #include<stdio.h> 3 #include<math.h> 4 #define MIN(x,y)(x<y?x:y) 5 int N,M; 6 int s1,s2,s3; 7 double gett(double x,double y){ 8 return sqrt(x*x+M*M)/s1+sqrt(y*y+M*M)/s2+sqrt((N-x-y)*(N-x-y)+M*M)/s3; 9 } 10 double sanfen(double l,double r,double mid){ 11 double m,mm; 12 while(r-l>1e-10){ 13 m=(l+r)/2; 14 mm=(m+r)/2; 15 if(gett(mid,m)<gett(mid,mm))r=mm; 16 else l=m; 17 } 18 return gett(mid,l); 19 } 20 int main(){ 21 while(~scanf("%d%d",&N,&M)){ 22 scanf("%d%d%d",&s1,&s2,&s3); 23 double mid,midmid; 24 double ans1,ans2; 25 double l=0,r=N; 26 while(r-l>1e-10){ 27 mid=(l+r)/2;midmid=(mid+r)/2; 28 ans1=sanfen(0,N,mid); 29 ans2=sanfen(0,N,midmid); 30 if(ans1<ans2)r=midmid; 31 else l=mid; 32 } 33 printf("%.10lf\n",sanfen(0,N,l)); 34 } 35 return 0; 36 }