赞
踩
问题描述
话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先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 ,收工。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。