HDU2059
dp,题意自己看,不再赘述
把起点和终点和起点也看做加油站,则用dp数组来记录到每个加油站的最短时间
dp[i]=min(dp[j]+t,dp[i]) 0<=j<i
即到达第i个加油站的最短时间是由前i个加油站直接到第i个加油站中最短的时间,t表示从第j个加油站途中不加油到第i个加油站的时间
#include <iostream>
#define INF 999999
using namespace std;
double dp[105];
int main()
{
int L;
int dis[105];
while(cin>>L)
{
int n,c,t;
cin>>n>>c>>t;
int vr,vt1,vt2;
cin>>vr>>vt1>>vt2;
for(int i=1;i<=n;i++)
cin>>dis[i];
dis[0]=0;
dis[n+1]=L;
double tem;
for(int i=1;i<105;i++)//初始化要到位!!由于<100WA了两发
dp[i]=INF;
dp[0]=0;
for(int i=1;i<=n+1;i++)
{
for(int j=0;j<i;j++)
{
int len=dis[i]-dis[j];
if(len<=c)
tem=len*1.0/vt1;
else
tem=(len-c)*1.0/vt2+c*1.0/vt1;
if(j!=0)
tem+=t;
dp[i]=min(dp[j]+tem,dp[i]);
}
}
double tt=L*1.0/vr;
if(dp[n+1]>tt)
printf("Good job,rabbit!\n");
else
printf("What a pity rabbit!\n");
}
return 0;
}

浙公网安备 33010602011771号