HDOJ2059简化记录条件找出问题本质DP

61 篇文章 0 订阅
19 篇文章 0 订阅
<pre name="code" class="cpp">//龟兔赛跑问题提取信息:加油站位置,当前加油站处的油量,到达此地的最短时间
//到达每一个事件点的时候查看上一个事件点充或者没充电到达该点的最短时间但是电量记录就会
//会繁琐,那么有什么办法可以避免这个问题呢
//后来发现其实根本不用管还剩下多少电量,只用看最后一次加油的位置是哪就行了
//46MS 1620K 
#include <iostream>
using namespace std;

#define  MAX_N 110
static double L;
static int N;
static double C,T;
static double VR,VR1,VR2;

static double stop[MAX_N];//加油站
static double dp[MAX_N];
static double t1;
static void DP()
{
	for (int i=0;i<=N+1;++i)
	 dp[i] = 0x3f3f3f3f;
	dp[0] = 0;//开始处不用加油
	if (stop[1]>=C)
		dp[1] = C/VR1 + (stop[1]-C)/VR2;
	else
		dp[1] = stop[1]/VR1;

	for (int i=2;i<=N+1;++i)
	{
		//寻找上一次加油的地点
		for (int j=i-1;j>=0;j--)//最后一次加油的地方
		{
			double len = stop[i] - stop[j];
			double tn = 0;
			if (len>=C)
			  tn = C/VR1 + (len-C)/VR2 + T;
			else
			  tn = len/VR1 + T;

			 if (j==0)
			  dp[i] = min(dp[i],dp[j]+tn-T);
			 else
			  dp[i] = min(dp[i],dp[j]+tn);
		}
	}
	if (dp[N+1]<t1)
	 printf("What a pity rabbit!\n");
	else
	 printf("Good job,rabbit!\n");
}

int main()
{
	while(~scanf("%lf",&L))
	{
		scanf("%d %lf %lf",&N,&C,&T);
		scanf("%lf %lf %lf",&VR,&VR1,&VR2);
		t1 = L/VR;
		for (int i=1;i<=N;++i)
		{
			scanf("%lf",&stop[i]);
		}
		stop[N+1] = L;
		DP();
	}

	return 0;
}



                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值