HDU 2059

来源:互联网 发布:行知科技 编辑:程序博客网 时间:2024/06/05 15:47

http://acm.hdu.edu.cn/showproblem.php?pid=2059

这题想了很久,感觉有了一点点想法了,然后就去写,写到一半才发现自己的想法有问题,没办法了,去看了看别人的题解,才发现自己把题想的太复杂了。

用dp[i]来记录到第i个加油站所用的最小时间,则dp[i] 为第j个加油站直接到第i个加油站的时间加上dp[j],0<= j <i;

把起点和终点初始化为第0个和第n+1个加油站。

#include <cstdio>#include <cstring>#include <string>#include <queue>#include <stack>#include <vector>#include <iostream>#include <algorithm>#include <ctime>#include <fstream>using namespace std;#define int64 __int64#define ll long long#define M 10005double len , c , t , vr , vt1 , vt2;int n;double dp[M] ,arr[M];double Solve(){int i , j;arr[0] = 0;arr[n+1] = len;for (i = 1 ; i <= n+1 ; i++){double MIN = 1<<30;for (j = 0 ; j < i ; j++){double tmp = arr[i]-arr[j];tmp = tmp>c ? c/vt1+(tmp-c)/vt2 : tmp/vt1;if (j != 0)tmp += t;MIN = min(MIN,tmp+dp[j]);}dp[i] = MIN;}return dp[n+1];}int main(){while (~scanf("%lf",&len)){scanf("%d%lf%lf",&n,&c,&t);scanf("%lf%lf%lf",&vr,&vt1,&vt2);for (int i = 1 ; i <= n ; i++)scanf("%lf",arr+i);if (Solve() > 1.0*len/vr)printf("Good job,rabbit!\n");elseprintf("What a pity rabbit!\n");}return 0;}