Codeforces 5D Follow Traffic Rules

【题意概述】

  某个物体要从A途经B到达C,在通过B的时候速度不能超过vd.  它的加速度为a,最大速度为vm;AB之间距离为d,AC之间距离为L; 问物体最少花多少时间到达C.

【题解】

  分情况讨论。

  若物体一直加速,通过B之前速度已经超过了vd,那么显然物体必须先加速后减速才能保证通过B是速度为vd. 

    先加速后减速也分为两种情况:加速后立即减速、加速后保持最大速度vm一段时间后再减速。

    通过了B之后物体从速度vd一直加速,直至到达C或者达到最大速度vm.

  若物体无法在通过B之前达到vd,那么显然物体一直加速,之后保持最大速度vm前进即可。

  做完了以上的分析,我们就可以结合物理公式直接计算。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #define rg register
 6 #define N 200010
 7 using namespace std;
 8 int a,vm,l,d,vd;
 9 double ans;
10 inline int read(){
11     int k=0,f=1; char c=getchar();
12     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
13     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
14     return k*f;
15 }
16 int main(){
17     a=read(); vm=read(); l=read(); d=read(); vd=read(); 
18     double t0=1.0*vd/a;
19     double s0=0.5*vd*t0;
20 //    printf("%.2lf %.2lf
",t0,s0);
21     if(s0<d&&vm>=vd){
22 //        puts("a1");
23         double t1=1.0*(vm-vd)/a;
24         double s1=(vd+vm)*t1;
25         if(s0+s1<=d){
26             ans=t0+t1+t1+(d-s0-s1)/vm;
27         }
28         else{
29             double delta=4*vd*vd-4*a*(s0-d);
30             t1=1.0*(-2*vd+sqrt(delta))/(2*a);
31             ans=t0+t1+t1;
32         }
33 //        printf("%.7lf
",ans);
34         int d2=l-d;
35         double t2=1.0*(vm-vd)/a;
36         double s2=(vd+vm)*t2/2;
37         if(s2<d2){
38 //            puts("c1");
39             ans+=t2+1.0*(d2-s2)/vm;
40         }
41         else{
42 //            puts("c2");
43             double vx=sqrt(vd*vd+2*a*d2);
44             double t3=(vx-vd)/a;
45             ans+=t3;
46         }
47     }
48     else{
49 //        puts("a2");
50         double v=sqrt(2*a*d);
51 //        printf("%.2lf
",v);
52         if(v>=vm){
53             double t1=1.0*vm/a;
54             ans=t1+(d-vm*t1/2)/vm+1.0*(l-d)/vm;
55         }
56         else{
57             double t1=1.0*v/a;
58             ans=t1;
59 //            printf("%.7lf
",ans);
60             int d2=l-d;
61             double t2=1.0*(vm-v)/a;
62             double s2=(v+vm)*t2/2;
63 //            printf("%.2lf
",s2);
64             if(s2<d2){
65                 ans+=t2+1.0*(d2-s2)/vm;
66             }
67             else{
68                 double vx=sqrt(v*v+2*a*d2);
69                 double t3=(vx-v)/a;
70                 ans+=t3;
71             }
72         }
73     }
74     printf("%.12lf
",ans);
75     return 0;
76 }
原文地址:https://www.cnblogs.com/DriverLao/p/9877069.html