计算第n个站时,到第1~n-1个站的时间已经计算好且为最小,故只需要计算在第i个站换tire然后再开到第n个站的时间,取最小。
#include <iostream>
#include <cstdio>
using namespace std;
double ans[110]; //到达各站的最短时间
double times[10010]; //走x米的时间,各个参数相同,可用同一个表示
int a[110];
double b, v, e, f;
int n, r;
//计算注意从x走到x + 1,需要用x来表示距离而不是x + 1
void _cal() {
times[0] = 0.0;
for(int x = 0; x <= a[n - 1]; x++) {
if(x >= r) times[x + 1] = times[x] + 1 / (v - e * (x - r));
else times[x + 1] = times[x] + 1 / (v - f * (r - x));
}
}
int main() {
//freopen("1.txt", "r", stdin);
while(cin >> n && n != 0) {
for(int i = 0; i < n; i++) cin >> a[i];
cin >> b >> r >> v >> e >> f;
_cal();
for(int i = 0; i < n; i++) {
ans[i] = times[a[i]];
for(int j = 0; j < i; j++) {
ans[i] = min(ans[i], ans[j] + times[a[i] - a[j]] + b);
}
}
printf("%.4lf/n", ans[n - 1]);
}
return 0;
}