链接: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<iostream>
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<i;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");
}
}