首先这道题目变量非常的多,处理起来我感觉非常的复杂。
这题我的思路是比较龟兔所用的时间。
一开始我的思路没有用到递归,只是想着取一步一步来计算。因为充完电后能行驶的路程是一定的,所以可以分两种情况,第一种是电动车走不到下一个充电站,那么这样的话,龟到下一个充电站充完电的时间就是C/VT1+(剩余路程)/VT2+T。第二种情况就是电动车满电时可以到一个或以上的充电站,那么这个时候,乌龟选择的充电站就是刚好能到这个充电站而到不了下一个充电站,那么这个时候乌龟的所用时间就是(当前充电站-上一个充电的充电站)/VT1+T。
我认为这种思路是可行的,代码如下
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
double L;
while(~scanf("%lf",&L)){
double N,C,T,vr,vt1,vt2,p[100]={0};
cin>>N>>C>>T>>vr>>vt1>>vt2;
for(int i=1;i<=N;i++) scanf("%lf",&p[i]);
p[(int)N+1]=L;
double t1=L/vr;
double t2=0;
double s=0;
int i,j;
int index=0;
int _t=0;
bool flag=true;
for(j=1;j<=N+1;j++){
if(p[j]-p[index]<=C) ;//判断能否行驶到下一个充电站
else {
if(index==j-1){//可以
t2=t2+C/vt1+(p[j]-p[index]-C)/vt2+T;
if(j==N+1) t2=t2-T;
index=j;
s=p[index];
}
else{
t2=t2+(p[j-1]-p[index])/vt1+T;//不可以
index=j-1;
if(j==N+1&&p[j]-p[index]<=C) t2=t2+(p[j]-p[index])/vt1;
j=j-1;
s=p[index];
}
}
}
cout<<t2<<endl;
if(t2<t1) printf("What a pity rabbit!\n");
else printf("Good job,rabbit!\n");
}
}
写完以后我去提交发现根本不能通过,然后我只能上网看看别人的思路,发现原来别人用的是递归,然后我复制了别人的代码做测试,发现对于不同的数据,非递归的代码虽然有的参数也可以与递归算到的答案一样,但并不是全部。
对比起来会发现,运用递归的话可以将所有的情况罗列出来,再对比之间所接触到的递归的题目以及这道题目,递归的题目明显的会有很多种组合,如果不用递归的话无法一一将所有情况都列出来,从这里我学会了如何分辨什么时候会用到递归,什么时候这道题不是递归。