HDU题目
- 大概就是把每个充电站看成一个点(1-n),再加入最开始的点(0)和终点(n+1)
- dp[i]表示到每个点所需的最小时间
- 那么j可定是从i(range 0-j-1) 过来的考虑过来的途径有两种 小电瓶(+充电时间),人工骑车
- 从0转移的需要特殊处理因为0是一开始就已经充好电的就不需要计算充电的时间啦~~
- 又水了一题
#include<bits/stdc++.h>
using namespace std;
double d[110];
double dp[110];
const int inf=0x3f3f3f;
int main()
{
int l;
while(~scanf("%d",&l))
{
int n,c,t;scanf("%d%d%d",&n,&c,&t);
double vr,v1,v2;scanf("%lf%lf%lf",&vr,&v1,&v2);
for(int i=1;i<=n;i++) scanf("%lf",&d[i]);
d[0]=0,d[n+1]=l;
double ti=1.00*l/vr*1.00;
double minn,maxx;
for(int i=1;i<=n+1;i++)
{
dp[i]=inf*1.00;
}dp[0]=0;
for(int j=1;j<=n+1;j++)
{
for(int i=j-1;i>=0;i--)
{
if(d[j]-d[i]<=(double)c) minn=(double)((d[j]-d[i])/v1);
else minn=(double )((d[j]-d[i]-c)/v2+c/v1);
maxx=(double )((d[j]-d[i])/v2);
minn=min(maxx,minn+((i==0)?0:1.00*t));
dp[j]=min(dp[j],dp[i]+minn);
}
}
if(dp[n+1]>=ti)
{
puts("Good job,rabbit!");
}else
{
puts("What a pity rabbit!");
}
}
}