HDU-2059 新龟兔赛跑 原题链接
原题:
具体题目不在赘述,详情点链接。
题意:
兔子以恒定速度跑向终点,乌龟骑电动车,在赛道上有n个充电点,位置为pi,每一次充电可以骑行c米,每一次充电需要耗费时间t,速度为vt1m/s,若电动车没电则只以vt2m/s的速度蹬。请问乌龟能否跑过兔子。
题解:
一上来我们不难发现兔子的时间是已知且固定的。剩下的就是计算乌龟的时间。
对于乌龟赛跑,我们可以看出乌龟只有两种速度:vt1,vt2。因为乌龟有n个充电站,所以自然想到利用dp,对于每一个站点,都求出到达哪个站点的最短时间,在想下一个站点出发,最终的用时一定是最少的。
那么,怎么求到达一个站点的最短时间呢?
首先,我们知道pi数列是递增的所以直接依次遍历即可。
其次,对于每一个站点我们都要做出决策,是否充电。就要对每一个之前的站点来计算到达当前站点的最短时间。一直向后更新,直至终点。
/*
author wjl
*/
#include <iostream>
using namespace std;
double l,c,t,vr,vt1,vt2,p[105],dp[105],rt,tt,xt;
int n;
int main()
{
while(cin>>l)
{
cin>>n>>c>>t>>vr>>vt1>>vt2;
for(int i=1;i<=n;i++)
cin>>p[i];
p[0]=0;
p[n+1]=l;
dp[0]=0;
rt=l/vr;
for(int i=1;i<=n+1;i++)
{
double tt=10000000;
for (int j=0;j<i;j++)
{
int x=p[i]-p[j];
if (c>=x)
{
xt=x/vt1;
}
else
{
xt=c/vt1+(x-c)/vt2;
}
if (j)xt+=t;
if (tt>dp[j]+xt)
{
tt=dp[j]+xt;
}
}
dp[i]=tt;
}
if (dp[n+1]>rt)
cout << "Good job,rabbit!" << endl;
else
cout << "What a pity rabbit!" << endl;
}
return 0;
}
我是小白一个,
若有改进,欢迎指教!