xmu1125 越野车大赛(三分)

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之内,则认为是正确答案。

题解:二元函数用到了三次三分。。。

代码:

 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 }

 

posted @ 2015-10-08 13:42  handsomecui  阅读(306)  评论(4编辑  收藏  举报