AtCoder Beginner Contest 076 D - AtCoder Express

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 
#include 
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;
}







你可能感兴趣的:(ACM算法题)