7-39 龟兔赛跑(C语言数学法)

这题的题面长这样:

乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

输入格式:

输入在一行中给出比赛时间T(分钟)。

输出格式:

在一行中输出比赛的结果:乌龟赢输出 @_@ ,兔子赢输出 ^_^ ,平局则输出 -_- ,后跟1空格,再输出胜利者跑完的距离。

输入样例:
242

输出样例:
@_@ 726

分析一下题意:乌龟始终以 3m/min 的速度行进,而兔子的行进速度是 9m/min。兔子每次只会连续跑 10min,也就是 90m,如果兔子每次检查发现乌龟落后了,就会连续休息 30min。在这 30min 中乌龟会行进 30min * 3m/min = 90m.

那末从第 0min 开始兔子和乌龟起跑,第 10min 时兔子行进了 90m,乌龟行进了 30m,这时候兔子比乌龟领先于是休息。乌龟和兔子的落差 60m,乌龟需要花 20min 的时间追平,于是在第 30min,乌龟和兔子的行进距离相等,都为 90m.
兔子在第 40min 时醒来,此时乌龟领先兔子 10min * 3m/min = 30m,这段路程差兔子追平需要的时间是 30m/(9m/min-3m/min) = 5min.

那末是不是说在第 45min 的时候龟兔赛跑完成了一个周期呢?注意到兔子在检查到乌龟不落后于自己时会连续跑 10min,在第 45min 时兔子才跑出 5min,也就是说兔子在第 50min 才会停下来看一看乌龟在哪里。

继续推导就能得到这样一张图:
7-39 龟兔赛跑(C语言数学法)_第1张图片
横轴每一小格表示 10min,红线是兔子的行进路程,蓝线是乌龟的行进路程。推导的结果是龟兔赛跑的周期是 90min,每个周期的第0、30、45、60、90min 是乌龟和兔子路程相等的时间点。剩下的事情就是简单的对时间取余和区间判断了。

代码在下面:

#include 

int main() {
    int time = 0;
    scanf("%d", &time);
    getchar();

    int endDis = 0;
    // 周期 90 min 重复一次,也就是每 270 m 重复一次
    int circle = 270 * (time / 90);
    if (time%45 == 0 || time%30 == 0) {
        printf("-_-");  // 平局的情形,这里把对90取余得0、30、60处理成对30取余得0
        endDis = time * 3;
    } else if (time%90 < 30 || (time%90 < 60 && time%90 > 45)) {
        printf("^_^");  // 兔子赢的区间,赛跑时间过了(time/90)个周期
        if (time%90 < 10) { endDis = (time%90)*9 + circle; }
        else if (time%90 < 30) { endDis = 90 + circle; }  // 兔子在睡觉
        else if (time%90 < 50) { endDis = (time%90 - 45)*9 + circle + 135; }
        else { endDis = circle + 180 }  // 兔子还是在睡觉
    } else {
        printf("@_@");  // 乌龟赢的情形,由于乌龟始终匀速行进,路程很好处理
        endDis = time * 3;
    }
    printf(" %d", endDis);

    return 0;
}

你可能感兴趣的:(c语言)