AtCoder Beginner Contest 076 D

来源:互联网 发布:淘宝美工在哪里找素材 编辑:程序博客网 时间:2024/06/06 08:49

1匀加速阶段:inc=min{vi-cur,(lim+t[i]-cur)/2,t[i]}

2匀减速阶段:dec=max{0,cur+inc-lim}

3匀速阶段:kep=t[i]-inc-dec




//  main.cpp//  D - AtCoder Express////  Created by wenhan on 2017/10/28.//  Copyright © 2017年 wenhan. All rights reserved.//#include <cstdio>#include <algorithm>using namespace std;double t[105],v[105];int main(){    int n;    scanf("%d",&n);    for(int i=1;i<=n;i++)        scanf("%lf",&t[i]);    for(int i=1;i<=n;i++)        scanf("%lf",&v[i]);    double cur=0,ans=0;//cur为上一段速度,ans为路程    for(int i=1;i<=n;i++){        double a=0,b=0,c=0;//加速,减速,匀速(时间)        double lim=0x3f3f3f;//下一段的速度        double tmp=0;        for(int j=i+1;j<=n+1;j++){            lim=min(lim, v[j]+tmp);//这个式子写的很有味道,主要是取i+1可以取得的最大速度,v[j]+tmp            tmp+=t[j];//就是在跟新所能取到的速度,因为有可能所要的速度达不到最大,所以这里写的巧        }        a=min(min(t[i], v[i]-cur), (-cur+t[i]+lim)*0.5);//一直加速,先加速后匀速,先加速后减速        b=max(double(0),cur+a-lim);//不减速,有减速        c=t[i]-a-b;//匀速        ans+=0.5*(cur*2+a)*a;//计算加速        ans+=(cur+a)*c;//计算匀速        ans+=0.5*((cur+a)*2-b)*b;//计算减速        cur+=a;//跟新上一段的速度        cur-=b;    }    printf("%lf\n",ans);    return 0;}







原创粉丝点击