hdu 2059(DP)

///*
/*
	    刚开始想的太麻烦了,开两个数组记录当前最短和余量模拟过程,但感觉太烦,于是XX看网上大牛的思路,仰慕许久

	最优思路:dp[i]:记录到i的最小时间
	          从0 - (i-1) 判断确定加油后到i的时间
              可能会有疑问,如果之前到某一点 j 时还有余量(仍可加速),那 再加油 判断是不是会有问题
			  其实不会,如果到j你不加油,那肯定是之前的一点加油了,所以一直dp下来即可求出dp[n+1]
*/

#include <stdio.h>
#include <string.h>
const double MAX = 999999999.0;
double dp[105];
int main()
{
	int i,j,n;
	double L,c,t,vr,vh,vl,len;
	double temp,min;
	double a[105];
	while(scanf("%lf",&L)!=EOF)
	{
		scanf("%d %lf %lf", &n, &c, &t);
		scanf("%lf %lf %lf", &vr, &vh, &vl);
		for(i=1;i<=n;i++)
			scanf("%lf", &a[i]);
		a[0]=0.0; a[n+1]=L;
		dp[0]=0.0;
		for( i=1; i<=n+1; i++)
		{
			min = MAX;
			for( j=0; j<i; j++)
			{
				len = a[i] - a[j];
				temp = len > c ? (c/vh+(len-c)/vl) : (len/vh);
				if(j)
					temp += t;
				if(min > temp + dp[j])
					min = temp + dp[j];
			}
			dp[i]=min;
		}
		printf("%s\n", dp[n+1] < (1.0*L)/vr ? "What a pity rabbit!" : "Good job,rabbit!" );
	}
	return 0;
}

posted @ 2010-12-06 17:33  kfinder  阅读(1241)  评论(0编辑  收藏  举报