2059 龟兔赛跑

题目

首先这道题目变量非常的多,处理起来我感觉非常的复杂。

这题我的思路是比较龟兔所用的时间。

一开始我的思路没有用到递归,只是想着取一步一步来计算。因为充完电后能行驶的路程是一定的,所以可以分两种情况,第一种是电动车走不到下一个充电站,那么这样的话,龟到下一个充电站充完电的时间就是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");
    }
}

写完以后我去提交发现根本不能通过,然后我只能上网看看别人的思路,发现原来别人用的是递归,然后我复制了别人的代码做测试,发现对于不同的数据,非递归的代码虽然有的参数也可以与递归算到的答案一样,但并不是全部。

对比起来会发现,运用递归的话可以将所有的情况罗列出来,再对比之间所接触到的递归的题目以及这道题目,递归的题目明显的会有很多种组合,如果不用递归的话无法一一将所有情况都列出来,从这里我学会了如何分辨什么时候会用到递归,什么时候这道题不是递归。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。