龟兔赛跑
问题描述
话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。
然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1米),乌龟的速度v2,以及兔子对应的t,s值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。
输入格式
输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中(v1,v2<=100;t<=300;s<=10;l<=10000且为v1,v2的公倍数)
输出格式
输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。
第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。
样例输入
10 5 5 2 20
样例输出
D
4
样例输入
10 5 5 1 20
样例输出
R
3
样例输入
10 5 5 3 20
样例输出
T
4
问题分析:,
当第一眼看到这个问题的时候,可能会被过多的变量,和不断变化的赛跑过程给弄得晕头转向,
所以在这里,我们理一下本题思路:
1,明白相关变量的含义,比如:
t--兔子领先米数,s--停下休息秒数,l--赛道长度,v1--兔子速度,v2--乌龟速度
2,明白,当有一方 路程s1,s2 大于l 时,输出结果
判断条件:
while(s1<l && s2<l)
输出结果:
if (s1>s2) printf("R\n");
else if (s2>s1) printf("T\n");
else printf("D\n");
3,每秒兔子和乌龟的路程数都会增加,同时秒数增加
s1 += v1;
s2 += v2;
i++;
4,当兔子的路程大于乌龟 t 米后,停下来休息
if (s1 - s2 >= t)
s1 -= v1*s; // 核心:以乌龟的不变的速度为标准 减去休息时少跑的路程
5,注意跳出while 的条件
a, while(s1<l && s2<l)
b, if (s1 == l || s2 == l)
break;
6,根据分析,写出代码
代码展示(已验证):
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int v1, v2, t, s, l, s1 = 0, s2 = 0, i = 0; //相关变量已经在题目中定义
scanf("%d %d %d %d %d", &v1, &v2, &t, &s, &l);
while (s1<l && s2<l)
{
s1 += v1;
s2 += v2;
i++;
if (s1 == l || s2 == l)
break;
if (s1 - s2 >= t)
s1 -= v1*s; // (记住乌龟的不变速度) 减去休息时少跑的路程
}
// 输出结果
if (s1>s2) printf("R\n");
else if (s2>s1) printf("T\n");
else printf("D\n");
printf("%d", i); //输出 秒数
return 0;
}
泡泡:
龟兔赛跑的动态变化的过程,想的太多,会很头疼,用 while 拿捏整个赛跑过程,写好跳出 while 的条件,
也就相当于有了一个正确的结束,当结束是正确的,那么进行过程的代码描述:
路程的相加
秒数相加
是否等于赛道长度
是否超过乌龟 t 米
当while 结束,就可以根据 s1,s2 的大小判断,进行输出了
ok ,收工。