您的位置:首页 > 其它

杭电2059龟兔赛跑

2014-10-04 15:44 176 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2059

我们需要输入的有

(1)l

(2)n,c,t;

(3)vr,v1,v2;

(4)p[1],p[2],p[3], p
;

我们需要比较的是兔子的时间和乌龟的时间

兔子:1.0*l/vr;

乌龟:

乌龟的时间由题意可得,是需要最短的,所以我们只需要找出乌龟到终点的num种时间,并在这num种时间里找出最短的即可。



比如乌龟从加油站1到加油站4一共有四种不同时间的走法

1---2---3---4;

1---2---4;

1---4;

1---3---4;

如果要求乌龟从加油站1到加油站4的最短时间,即把这四种不同走法的时间分别算出来,取最小的即可。

同理,从第1个站到第i个站的时间加起来,即为所求,这儿就可以for循环语句来处理。

这样,就算出了乌龟所需的最短时间。

#include<stdio.h>
int main()
{
int l,n,c,t,vr,v1,v2,p[105],i,j,len;
double min,e,dp[105];
while(scanf("%d",&l)!=EOF)
{
scanf("%d%d%d",&n,&c,&t);
scanf("%d%d%d",&vr,&v1,&v2);
for(i=1;i<=n;i++)
scanf("%d",&p[i]);
p[0]=0;
p[i]=l;
dp[0]=0;
for(i=1;i<n+2;i++)
{
min=0xffffff;
for(j=0;j<i;j++)
{
len=p[i]-p[j];
e=c>len?1.0*len/v1:c*1.0/v1+(len-c+0.0)/v2;
e+=dp[j];//前j个站点的时间累加
if(j)
e+=t;//加油所需的时间
if(min>e)
min=e;
}
dp[i]=min;//到第i个站的最短时间

}
if(1.0*l/vr>dp[n+1])
printf("What a pity rabbit!\n");
else
printf("Good job,rabbit!\n");
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: