已知起點速度 s、終點速度 e、總時間 t、每秒速度變化上限 d。求在 t 秒內行駛的最大距離。速度序列需滿足 |v[i] - v[i-1]| ≤ d,v[1]=s, v[t]=e。
貪心構造最優速度序列:
a[1]=s, a[t]=e。a[i] = min(a[i-1] + d, e + (t-i)*d),確保既不超過變化上限,又能最終到達 e。a[i] = min(a[i+1] + d, s + (i-1)*d)。a[i] 即為最大距離。#include <iostream>
#include <cstring>
using namespace std;
int main() {
int s, e, t, d;
while (cin >> s >> e) {
cin >> t >> d;
int a[205] = {0};
a[1] = s; a[t] = e;
if (s <= e) {
for (int i = 2; i < t; i++)
a[i] = min(a[i-1] + d, e + (t - i) * d);
} else {
for (int i = t-1; i >= 2; i--)
a[i] = min(a[i+1] + d, s + (i - 1) * d);
}
long long ans = 0;
for (int i = 1; i <= t; i++) ans += a[i];
cout << ans << endl;
}
return 0;
}
時間 O(t),空間 O(t),t ≤ 200 極小。