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\n",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\n",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\n",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\n",ans); 60 int d2=l-d; 61 double t2=1.0*(vm-v)/a; 62 double s2=(v+vm)*t2/2; 63 // printf("%.2lf\n",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\n",ans); 75 return 0; 76 }