HDOJ 2059 龟兔赛跑 【DP】

31 篇文章 0 订阅
24 篇文章 0 订阅

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

//4427480	2011-08-16 15:40:49	Accepted	2059	15MS	176K	1191 B	C	ylwh!
//4427520	2011-08-16 15:43:31	Accepted	2059	0MS	    176K	1301 B	C	ylwh!
#include <stdio.h>
#include <string.h>
#define N 102
#define MAX 99999
int d[N], VT1, VT2, VR, n,  C,  L;
float tt[N], T;
float fun(int x, int y, int * z)
{
	float ans = 0;
	if(x <= y)
	{
		ans = x * 1.0 / VT1;
		*z = y - x;
	}
	else
	{
		*z = 0;
		ans = y * 1.0 / VT1 + (x - y) * 1.0 / VT2;
	}
	return ans;
}
int main()
{

	int i, j, k, pre, left1, left2, left[N], temp;
	float temp1, temp2, ans;
	while(scanf("%d", &L)!= EOF)
	{
		scanf("%d%d%f", &n, &C, &T);
		scanf("%d%d%d", &VR, &VT1, &VT2);
		for(i=1; i<=n; i++)
			scanf("%d", &d[i]);
		tt[1] = fun(d[1], C, &left[1]);
		d[n+1] = L;
		for(i=2; i<=n+1; i++)
		{
			tt[i] = MAX;
			for(j=i-1; j >= 1; j--)//刚开始只根据上一个点的状况更新,后来CW说这样肯定不对,就简单推了一下发现...真的不对,假设判断第i+1个站点的状况时,如果存在left<d[i+1]-d[i-1]<C,如果再加上T非常小的话就会出错。
			{
				temp1 = fun(d[i] - d[j], left[j], &left1) + tt[j];
				temp2 = fun(d[i] - d[j],    C, &left2) + T + tt[j];
				if(temp1 < temp2 && temp1 < tt[i] )
				{
					tt[i] = temp1;
					temp = left1;
				}
				else if(temp2 < temp1 && temp2 < tt[i])
				{
					tt[i] = temp2;
					temp = left2;
				}
				if(d[i] - d[j] > C)//根据上边的判断,只需要由i之前C长度内的站点的状态更新i即可
					break;
			}
			left[i] = temp;

		}
		ans = tt[n+1];
		if(ans > L * 1.0 / VR)
			printf("Good job,rabbit!\n");
		else
			printf("What a pity rabbit!\n");
	}
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值