题意 你在路上走 每秒钟的开始都可以改变自己的速度(改变速度都是瞬间完成的) 知道你开始的速度v1 结束时的速度v2 整个过程所用时间t 以及每秒最多改变的速度d 求这段时间内你最多走了多远
最优的肯定是先把速度从v1升到最大 然后从最大减到v2 使得用的时间不会超多t 因为肯定是足够从v1减为或升到v2的 那么我们只用从两端往中间靠 哪边的速度小 哪边就加上d 知道两边相邻 这样就能保证每次改变的速度都最大 而且最后两端的速度差也不会大于d 也就是最优答案了
#include <bits/stdc++.h> using namespace std; const int N = 105; int v[N]; int main() { int v1, v2, t, d, k; while(~scanf("%d%d%d%d", &v1, &v2, &t, &d)) { v[0] = v1, v[t - 1] = v2; int le = 0, ri = t - 1, ans = 0; while(le < ri - 1) { if(v[le] < v[ri]) v[le + 1] = v[le++] + d; else v[ri - 1] = v[ri--] + d; } for(int i = 0; i < t; ++i) ans += v[i]; printf("%d\n", ans); } return 0; } //Last modified : 2015-04-13 00:27
Codeforces 534B Covered Path(贪心)
原文地址:http://blog.csdn.net/acvay/article/details/45029055