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