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

很显然的加血的那种类型的题目,比赛遇过一次。

看上面这个图,就是到达每站的时候,把可能通过其他方式到达该站的时间都算出来,然后取最小值,

View Code
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#define maxn 10000
#define inf ~0U>>1
using namespace std;
int dis[maxn];
double dp[maxn];
double min(double a,double b)
{
    return a<b?a:b;
}
int main()
{
    int l;
    int n,c,t;
    int v1,v2,v3;
    while(cin>>l)
    {
        cin>>n>>c>>t;
        cin>>v1>>v2>>v3;
        memset(dis,0,sizeof(dis));
        for(int i=1;i<=n;i++)
            cin>>dis[i];
        dis[n+1]=l;
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n+1;i++)
        {
            double Min=inf;
            for(int j=0;j<i;j++)
            {

                int len=dis[i]-dis[j];
    double temp=len>c?1.0*c/v2+1.0*(len-c)/v3:1.0*len/v2;
                temp+=dp[j];
                if(j)temp+=t;//在j站要加血
                Min=min(Min,temp);
            }
            dp[i]=Min;
        }

        if(dp[n+1]<1.0*l/v1)
        cout<<"What a pity rabbit!"<<endl;
        else
        cout<<"Good job,rabbit!"<<endl;
    }
    return 0;
}
posted on 2012-09-18 23:57  一把刷子  阅读(270)  评论(0编辑  收藏  举报