龟兔赛跑

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


思路:
一个加油站到另一个加油站有多种路程,可以加油也可以不加油,本题我们的思路是
以加油站为点,计算到达每个加油站之间的最优方法依次叠加

假如有三个加油站,先算起点到第一个加油站的时间(1.两加油站距离大于C /// 2.小于C),然后记录在数组mint中,然后第二个加油站到起点有两种路
1是没有在第一个加油站加油,也就是说直接从起点到第二个加油站
2是在第一个加油站加油了,这个时候的路程经过前面一次计算已经得出了到第一个站的距离mint[1],这个时候在算第一个站到第二站的时间time,总的时间就是mint[1]+time+T(因为从第一个站开始算,必定进行了一次加油),
两次结果进行判断之后,而后每次得出来的mint都是最好的结果

代码如下:
#include

using namespace std;

int main()

{

int L, N, C, T, VR, VT1, VT2;

int p[150];

double time;

double mint[150];

while(scanf("%d", &L)!=EOF)

{

cin>>N>>C>>T;

cin>>VR>>VT1>>VT2;

for(int i = 1; i<=N; i++)

{

cin>>p[i];

}

p[0] = 0;

p[N+1] = L;

mint[0] = 0;

for(int i=1;i<=N+1;i++)

{

double min = 999999999;

for(int j = 0; j

{

if(p[i]-p[j] > C)                          // i和j站之间的距离是否比C大

{

time = 1.0*C/VT1 + 1.0*(p[i]-p[j]-C)/VT2;      //若是则要另外加上脚踩的时间

}

else

time = 1.0*(p[i]-p[j])/VT1;          //直接全程用电动车的时间

time += mint[j];                    //将先前的时间加上,记住mint[0] = 0

if(j)

time += T;                  //当加了一次油时是要加加油时间的

if(min>time)

{

min = time;                多种路程得出最短的时间

}

}

mint[i] = min;                  //记录第i站台的这个时间,用来叠加下一个加油站的时间

}

double timer = 1.0*L/VR;

if(mint[N+1]>timer)

{

printf("Good job,rabbit!\n");

}

else

printf("What a pity rabbit!\n");

}

}

你可能感兴趣的:(龟兔赛跑)