hdoj 2059 龟兔赛跑

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

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

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

}

你可能感兴趣的:(OJ)