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;
}

 

posted @ 2015-03-10 16:15  伟gg  阅读(497)  评论(0编辑  收藏  举报