题意:
知道兔子匀速跑步时间 v
小龟 骑电动车时间 v1 和蹬电动车时间v2..
知道总路程 l 电动车充满电可以维持路程c..
还有赛道上的充电器的数目 n 和每个充电器离原点的距离 ni..
问兔子能不能跑赢小龟..
思路:
dp[ ] 记录 到该充电点花费时间最小值..
然后对每一个充电点进行计算..
for j 从 0 开始 到 i
计算 第 j 个點充满电后 到 第 i 个充电点花费的时间..
加上dp[ j ]..算出到第 i 个點的时间最优值..
Tips:
初始状态: dp[0] = 0;
动态转移方程: dp[ i ] = min{dp[ j ] + t}
结果: dp[n+1]
PS:开始的时候是不用充电的..所以计算最少时间的时候..如果是从零点开始就不用算充电的时间..
其中把dp[ n + 1] 设为终点..
Code:
#include <stdio.h>
#include <cstring>
int main()
{
int i, j, k;
int l, n, c, t;
int v, v1, v2;
int p[110];
double dp[110];
double tt, min;
while(scanf("%d %d %d %d", &l, &n, &c, &t) != EOF)
{
scanf("%d %d %d", &v, &v1, &v2);
dp[0] = p[0] = 0;
for(i = 1; i <= n; ++i)
scanf("%d", &p[i]);
p[n+1] = l;
for(i = 1; i <= n+1; ++i){
min = 0xffffff;
for(j = 0; j < i; ++j){
int len = p[i] - p[j];
tt = len>c?c*1.0/v1 + (len-c)*1.0/v2 : len*1.0/v1;
tt += dp[j];
if(j) tt+=t;
if(min > tt) min = tt;
}
dp[i] = min;
}
puts(dp[n+1] < l*1.0/v?"What a pity rabbit!":"Good job,rabbit!");
}
return 0;
}