HDU 2059 龟兔赛跑 DP

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/nwpu2017300135/article/details/81707402

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

题意:中文

题解:dp[i]表示到第i个充电站需要的最短时间。转移时枚举前面的充电站作为最后一个充电站时候的值。起点设为第0个充电站,七点不需要充电,所以设为负数抵消充电费用。

代码:

#include <iostream>
#include <cstdio>
using namespace std;
double dp[105];
int left[105];
int p[105];
int L,n,c,t,vr,vt1,vt2;
double gettime(int i,int j){
	double len=p[j]-p[i];
	if(len<c){
		return len*1.0/vt1;
	}
	return c*1.0/vt1+(len-c*1.0)/vt2;
}
int main()
{
	int i,j;
	double rt;
	while(~scanf("%d",&L)){
		scanf("%d%d%d",&n,&c,&t);
		scanf("%d%d%d",&vr,&vt1,&vt2);
		for(i=1;i<=n;i++)scanf("%d",&p[i]);
		p[0]=0;
		p[n+1]=L;
		rt=L*1.0/vr;
		dp[0]=-t;
		for(i=1;i<=n+1;i++)dp[i]=0x3f3f3f3f;
		for(i=1;i<=n+1;i++){
			for(j=0;j<i;j++){
				dp[i]=min(dp[i],dp[j]+t+gettime(j,i));
			}
		}
		//for(i=0;i<=n+1;i++)printf("%f ",dp[i]);
		if(dp[n+1]<rt)printf("What a pity rabbit!\n");
		else printf("Good job,rabbit!\n");
	}
   // cout << "Hello world!" << endl;
    return 0;
}

 

展开阅读全文

没有更多推荐了,返回首页