题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059
思路(看别人博客。。):把起点和终点也看做充电站,假设现在在第i个充电站,那么dp[i]=min(第0个充电站加满电到第i个充电站所用时间,第1个充电站加满电到第i个充电站所用时间……第i - 1个充电站加满电到第i个充电站所用时间),然后用dp[n + 1] 和兔子所用的时间比一下就好了。
代码:
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define Max 0x3f3f3f3f int p[105]; int n,c,t; int vr,vt1,vt2; double dp[105]; int L; int main() { while(~scanf("%d",&L)) { memset(p,0,sizeof p); memset(dp,0,sizeof dp); scanf("%d%d%d",&n,&c,&t); scanf("%d%d%d",&vr,&vt1,&vt2); for(int i = 1;i <= n;++i) scanf("%d",&p[i]); p[0] = 0; p[n + 1] = L; dp[0] = 0; for(int i = 1;i <= n + 1;++i) { dp[i] = Max; for(int j = 0;j < i;++j) { double temp; int len = p[i] - p[j] ; if(len < c) temp = (double)(len) / vt1; else temp = (double)(c) / vt1 + (double)(len - c) / vt2; if(j) temp += t; dp[i] = min(dp[i],dp[j] + temp); } } double tuzitime = (double)(L) / vr; if(dp[n + 1] < tuzitime) printf("What a pity rabbit!\n"); else printf("Good job,rabbit!\n"); } return 0; }