关于hdu 2059的完整解法与心得
首先我必须说一句。。。。这题对我来说实在是挺难的,,,做了好几个小时,不过值得庆幸的是最后在学长的帮助下终于做出来了。。。但是虽然难我却犯了无谓的错误浪费了许多宝贵的时间。。。首先最不应该忽略的就是清零。。。这个错误我已经犯N遍了。。。还有就是得多用些笔算神马的。。这样在调试的时候比较容易发现潜在的错误。。。
本题的主要思路:先考虑可能在任意一个加油站作为乌龟最后加油的地方。。。然后利用第推的思想卒个求和。。。。比如乌龟可能把第二个加油站作为最后加油的地点。。。由此我们需要依次求出把原点作为前一个加油站到第二个加油站的时间和把第一个加油站作为前一个加油站到第二加油站的时间。。。然后比较两种路径所用时间的多少求出把第二个作为最后加油站所用的最短时间。。。以此类推。。。以后各种情况均可由此法求得。。。。
#include"stdio.h"
int l,n,t,c,vr,vt1,vt2;
int i,j,p[105];
double timer,cmp,time[105],bestime;
double maxt(double *time,int n)
{
int index=0,i;
for(i=0;i<=n;i++)
if(time[index]>time[i])
index=i;
return time[index];
}
void foretime(double *time,int *p)
{
p[0]=0;
for(i=1;i<=n;i++)
{
for(j=0;j<i;j++)
{
if(p[i]-p[j]>c)
cmp=time[j]+c*1.0/vt1+(p[i]-p[j]-c)*1.0/vt2+t;
else
cmp=time[j]+(p[i]-p[j])*1.0/vt1+t;
if(j==0)
time[i]=cmp-t;
else if(time[i]>cmp)
time[i]=cmp;
}
}
}
int main( )
{
while(scanf("%d",&l)==1)
{
for(i=0;i<105;i++)
time[i]=0;
scanf("%d%d%d",&n,&c,&t);
scanf("%d%d%d",&vr,&vt1,&vt2);
for(i=1;i<=n;i++)
scanf("%d",&p[i]);
foretime(time,p);
for(i=0;i<=n;i++)
{
if(i==0)
{
if(l-p[i]>c )
time[i]=time[i]+c*1.0/vt1+(l-p[i]-c)*1.0/vt2;
else
time[i]=time[i]+(l-p[i])*1.0/vt1;
}
else if(l-p[i]>c)
time[i]=time[i]+c*1.0/vt1+(l-p[i]-c)*1.0/vt2+t;
else
time[i]=time[i]+(l-p[i])*1.0/vt1+t;
}
bestime=maxt(time,n);
timer=l*1.0/vr;
if(timer>bestime)
printf("What a pity rabbit!\n");
else
printf("Good job,rabbit!\n");
}
return 0;
}