杭电2059

此题是我转载的,开始我也不太懂怎么弄,后来才理解!!如果你现在也是不太懂,让我们一起ac它吧!
这道题的思路大致如下:
假设乌龟修了n个充电站,那么如果把起点和终点也算一个充电站的话一共有n+2个充电站,这样第一个
充电站充电的时间是0,接着进行两个循环,其中for(i=1;i<n+2;i++)是从第一个充电站开始循环,
对于每个i,对于循环for (j=0;j<i;j++)依次算出i其前面的每个充电站是否充电的时间!最后把最短的
时间付给min即可求出乌龟的最佳方案!!

#include<iostream>
using namespace std;
int main()
{
    int i,j,p[102];
    int l,n,c,t;
    int vr,v1,v2;
    int len;
    double dp[102],min,e;  
    while(scanf("%d",&l)!=EOF)
    {
        scanf("%d%d%d",&n,&c,&t);
        scanf("%d%d%d",&vr,&v1,&v2);
        dp[0]=p[0]=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",p+i);
        }
        p[i]=l;
        for(i=1;i<n+2;i++)
        {
            min = 0xffffff;
            for (j=0;j<i;j++)
            {
                len=p[i]-p[j];
                e=len>c?1.0*c/v1+(len-c+0.0)/v2:1.0*len/v1;
                e+= dp[j];
                if(j)
                 {
                     e += t;
                 }
                if (min>e)
                {
                    min=e;
                }
            }
            dp[i]=min;
        }
        puts(1.0*l/vr>dp[n+1]?"What a pity rabbit!":"Good job,rabbit!");
    }  
    return 0;

}

你可能感兴趣的:(杭电)