HDU 2059 龟兔赛跑 DP

早上蓝桥杯就有这题,做了两小时没做出来,结果一共才做了五题,哭瞎了,又被虐QAQ

DP.....DP..........DP我还傻傻的模拟。T T

哥哥竟然被杭电第11页水题虐了!!!


---------------------------------------------------被虐的分割线---------------------------------------------------

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

中文题不说题意

将起点和终点也当做发电站,这样就避免了两种情况的讨论

设dp[i]为设dp[i]为到达第i个发电站的最小时间,初始的时候为0,

dp[i]=min(dp[j] + t(i,j))  t(i,j)为从j充满电直接到i的时间。

#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=101;
const int INF=999999;
int main()
{
	double L;
	int N;
	double C,T;
	double vr,vt1,vt2;
	while(~scanf("%lf",&L))
	{
		double dis[MAXN];
		scanf("%d",&N);
		scanf("%lf%lf",&C,&T);
		scanf("%lf%lf%lf",&vr,&vt1,&vt2);
		for(int i=1;i<=N;i++)
			scanf("%lf",&dis[i]);
		
		dis[0]=0;//起点存入
		dis[++N]=L;	//终点存入
		double dp[MAXN]={0};    //设dp[i]为到达第i个发电站的最小时间,初始的时候为0
							//dp[i]=min(dp[j] + t(i,j)) t(i,j)为从j充满电到i的时间
		
		for(int i=1;i<=N;i++)
		{
			dp[i]=INF;		//每个点一开始设为无穷大~
			for(int j=0;j<i;j++)
			{
				double time=0;	
				double len=dis[i]-dis[j];
				if( C >= len )			//分情况讨论,C为充满电一次滑行的距离
					time=dp[j]+len/vt1;
				else
					time=dp[j]+ C/vt1+(len-C)/vt2;
				
				if(j!=0)		//一开始就充满电不需要时间
					time+=T;
				dp[i]=min(dp[i],time);    //每次取最小
			}
		}
		double tr=L / vr;	//兔子的时间
		if(tr <dp[N])
			printf("Good job,rabbit!\n");
		else
			printf("What a pity rabbit!\n");
	}
}


你可能感兴趣的:(dp,动态规划,ACM,HDU)