• 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 }
  • 相关阅读:
    getopt函数
    Pac的OI回忆录
    Python embed包使用
    Git add . Git add * 的区别
    Linux Python升级版本至2.7.5
    Linux6.3升级zlib
    一: Centos 虚拟机安装
    4.4 SpringCloud__服务注册与发现Eureka__自我保护机制
    4.3 SpringCloud__服务注册与发现Eureka__高可用集群配置
    4.2 SpringCloud__服务注册与发现Eureka__搭建注册中心
  • 原文地址:https://www.cnblogs.com/DriverLao/p/9877069.html
Copyright © 2020-2023  润新知