东华oj-挑战题第6题-龟兔赛跑预测

在这里插入图片描述

6 龟兔赛跑预测

作者: Turbo时间限制: 1S章节: 模拟

问题描述 :

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

这个题好复杂……逻辑简直绝了
我的思路是这样的:

每一秒兔子跑不跑要看情况,
如果之前没休息过,那么要跑
如果之前休息过了,那么要看兔子休息时间是否已经结束了
		如果兔子休息时间结束了,那么要看兔子是否领先t米
					如果兔子领先了t米以上,那么不跑,继续休息
					如果没有领先,那么要跑
		如果兔子休息时间没结束,那么不跑,继续休息 
而每一秒乌龟是一定要跑的

整理成代码如下(其实还经历了很多次WA……):

/*
	T6 龟兔赛跑预测 
*/
#include<stdio.h>

int main() {
	int time = 0;// 用于计时
	int turDis = 0, rabDis = 0;// 龟和兔子跑的距离 
	int lastReTime = 0;// 兔子上一次休息时间 
	int v1 = 99, v2 = 53, t = 171, s = 10, l = 5247;
	    
	scanf("%d%d%d%d%d", &v1, &v2, &t, &s, &l);
	
	time = 0;// 开始计时 
	while (1) {
		turDis += v2;// 龟一直跑
			
		if (time == 0) {// 第一秒兔子肯定会跑 
			rabDis += v1;
			if (turDis == l || rabDis == l) {// 判断是否已到终点 
				time++;
				break;
			}	
			if (rabDis - turDis >= t) {// 领先,休息 
				lastReTime = time + 1;
			}
			time++;
			continue; 
		}
		
		if (lastReTime == 0) {// 没休息过,说明前面一直不领先,继续跑 
			rabDis += v1;// 跑
			if (turDis == l || rabDis == l) {// 判断是否已到终点 
				time++;
				break;
			}
				
			if (rabDis - turDis >= t) {// 领先 
				lastReTime = time + 1;// 休息 
			}
			time++; 
			continue; 
		}
		
		if (time - lastReTime >= s) {// 检查休息时间是否结束 
			if (rabDis - (turDis - v2) < t) {// 未领先t米 
				rabDis += v1;// 跑 
				if (turDis == l || rabDis == l) {// 判断是否已到终点 
					time++;
					break;
				}
			} 
			else {// 领先
				lastReTime = time;// 休息 
			}
		}	 
		
		if (turDis == l || rabDis == l) {// 判断是否已到终点 
			time++;
			break;
		}
		time++; 
	}
	if (turDis < rabDis)
		printf("R\n");
	else if (turDis > rabDis)
		printf("T\n");
	else 
		printf("D\n");
	printf("%d\n", time);
	
	return 0;
}

害,看了下一些大佬的代码,果然我写的太复杂了,其实只需要计算二者的路程,而路程等于速度乘以时间,速度是恒定的,只是二者跑的时间有差别(因为兔子要休息,休息的时候是不跑的,所以不算时间),所以只需要关注时间就可以了。我想复杂了的原因就是我把兔子跑的时间和休息的时间杂糅了,这样就要分各种情况处理,太麻烦了。
修改之后的代码:

/*
	T6 龟兔赛跑预测 
	将跑的过程分成一段一段来处理
	每一段只有两种情况:
		第一种:兔子休息了s秒,乌龟在这段时间跑了s秒 
		第二种:兔子和乌龟都跑了1s 
*/
#include<stdio.h>

int main() {
	int turDis = 0, rabDis = 0;// 龟和兔子跑的距离 
	int turTime = 0, rabTime = 0;// 龟和兔子跑的时间 
	int v1 = 99, v2 = 53, t = 171, s = 10, l = 5247;
	    
	scanf("%d%d%d%d%d", &v1, &v2, &t, &s, &l);
	 
	while (turDis < l && rabDis < l) {
		// 兔子这一秒跑不跑取决于它有没有领先
		if (rabDis - turDis >= t) {// 领先,休息,休息这段时间当成“1s”来处理,简化问题 
			turTime += s;// 乌龟在兔子休息的时候也在跑,所以乌龟跑的时间直接加s
			turDis = turTime * v2;
			rabDis = rabTime * v1;// 兔子休息时间是没跑的,所以跑的时间不加,那么跑的路程也是不变的 
		} 
		else {
			turTime++;
			rabTime++;
			turDis = turTime * v2;
			rabDis = rabTime * v1; 
		}
	}
	if (turDis < rabDis)
		printf("R\n%d\n", turTime);
	else if (turDis > rabDis)
		printf("T\n%d\n", l / v2);
	else 
		printf("D\n%d\n", turTime);
	
	return 0;
}

从这个题我学到了:

  1. 问题中的两个对象截然不同时,它们的情况应该分开考虑,避免杂糅,比如这个题中乌龟跑的时间和兔子跑的时间不能混在一起
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章