题目链接: https://vjudge.net/problem/HDU-2059
思路
想了又想贪心好像不太行,于是好像只能dp了
不妨设 dp[i] 表示从起点到第i个站点所花的最少时间
我们可以把起点和终点也当成一个加油站,起点为dp[1] ,终点为dp[n + 1],中间有n个加油站,那么不难得到状态转移方程
dp[i] = min(dp[i], dp[j] + t(j, i)) (0 <=j < i)
其中t(j, i)表示从第j站到第i站所花费的时间
如果不理解看一下代码就理解了
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
double dp[105];
int dist[105]; //每个充电站到起点的距离
int main() {
int L;
while (cin >> L) {
int n, c, t;
int vr, vt1, vt2;
cin >> n >> c >> t;
cin >> vr >> vt1 >> vt2;
dist[0] = 0;
dist[n + 1] = L;
for (int i = 1; i <= n; ++i) {
cin >> dist[i];
}
//初始化
dp[0] = 0;
for (int i = 1; i < 105; ++i) {
dp[i] = INF;
}
double tmp;
for (int i = 1; i <= n + 1; ++i) { //枚举1到n + 1个充电站
for (int j = 0; j < i; ++j) {
int len = dist[i] - dist[j]; //两个充电站之间的距离
if (len <= c) {
tmp = 1.0 * len / vt1;
} else {
tmp = 1.0 * c / vt1 + 1.0 * (len - c) / vt2;
}
if (j != 0) {
tmp += t; //记得加上充电时间 起点是满电不用加
}
dp[i] = min(dp[i], dp[j] + tmp);
}
}
double tr = 1.0 * L / vr;
if (dp[n + 1] > tr) {
cout << "Good job,rabbit!\n";
} else {
cout << "What a pity rabbit!\n";
}
}
return 0;
}