赞
踩
这题的题面长这样:
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进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 才会停下来看一看乌龟在哪里。
继续推导就能得到这样一张图:
横轴每一小格表示 10min,红线是兔子的行进路程,蓝线是乌龟的行进路程。推导的结果是龟兔赛跑的周期是 90min,每个周期的第0、30、45、60、90min 是乌龟和兔子路程相等的时间点。剩下的事情就是简单的对时间取余和区间判断了。
代码在下面:
#include <stdio.h> 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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。