分数 20
全屏浏览题目
切换布局
作者 陈建海
单位 浙江大学
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式:
输入在一行中给出比赛时间T(分钟)。
输出格式:
在一行中输出比赛的结果:乌龟赢输出@_@
,兔子赢输出^_^
,平局则输出-_-
;后跟1空格,再输出胜利者跑完的距离。
输入样例:
242
输出样例:
@_@ 726
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
我的答案:
首先,我们需要根据题目描述模拟兔子和乌龟的赛跑过程。考虑到每10分钟兔子都会检查一下与乌龟的距离,我们可以将比赛时间分解为10分钟的小段进行处理。
以下是实现:
C语言实现:
#include <stdio.h>
int main() {
int T;
scanf("%d", &T);
int tortoise = 0, hare = 0; // 乌龟和兔子的距离
while (T > 0) {
// 兔子跑10分钟或剩余时间
int runTime = T >= 10 ? 10 : T;
hare += runTime * 9;
tortoise += runTime * 3;
T -= runTime;
if (hare <= tortoise && T > 0) {
hare += T >= 10 ? 10 * 9 : T * 9;
tortoise += T >= 10 ? 10 * 3 : T * 3;
T -= T >= 10 ? 10 : T;
} else if (T > 0) {
T -= 30; // 兔子休息
}
}
if (hare > tortoise) {
printf("^_^ %d\n", hare);
} else if (hare < tortoise) {
printf("@_@ %d\n", tortoise);
} else {
printf("-_- %d\n", hare);
}
return 0;
}
C++:
#include <iostream>
using namespace std;
int main() {
int T;
cin >> T;
int tortoise = 0, hare = 0; // 乌龟和兔子的距离
while (T > 0) {
// 兔子跑10分钟或剩余时间
int runTime = T >= 10 ? 10 : T;
hare += runTime * 9;
tortoise += runTime * 3;
T -= runTime;
if (hare <= tortoise && T > 0) {
hare += T >= 10 ? 10 * 9 : T * 9;
tortoise += T >= 10 ? 10 * 3 : T * 3;
T -= T >= 10 ? 10 : T;
} else if (T > 0) {
T -= 30; // 兔子休息
}
}
if (hare > tortoise) {
cout << "^_^ " << hare << endl;
} else if (hare < tortoise) {
cout << "@_@ " << tortoise << endl;
} else {
cout << "-_- " << hare << endl;
}
return 0;
}
总结:
学到了什么?
三元运算符
这是一个使用条件(三元)运算符的语句。条件运算符 `? :` 是C和C++中的一个三元运算符,它允许您基于一个条件来选择两个值中的一个。其语法是:
condition ? value_if_true : value_if_false
现在,我们来详细解释给定的语句:
int runTime = T >= 10 ? 10 : T;
1. `T >= 10`:这是一个条件判断,检查变量 `T` 是否大于或等于10。
2. `10`:如果上述条件为真(即 `T` 的值大于或等于10),那么表达式的结果就是这个值。
3. `T`:如果上述条件为假(即 `T` 的值小于10),那么表达式的结果就是 `T` 的当前值。
4. `int runTime`:声明一个整数变量 `runTime` 并初始化它。其初始值取决于 `? :` 表达式的结果。
所以,这整个语句的意思是:如果 `T` 大于或等于10,那么 `runTime` 的值为10;否则,`runTime` 的值为 `T`。
例如:
- 如果 `T` 的值是15,那么 `runTime` 将被赋值为10。
- 如果 `T` 的值是5,那么 `runTime` 将被赋值为5。
总结:
这道“龟兔赛跑”题目不仅让我们回想起了经典的寓言故事,也为我们带来了几个编程和算法方面的学习点:
1. **模拟与迭代**:题目基于实际情景设置了一系列规则,我们需要按照这些规则逐步模拟乌龟和兔子的赛跑过程。在许多编程问题中,模拟和迭代是一种常用的方法,尤其在涉及时间和事件驱动的场景中。
2. **条件判断的重要性**:在龟兔赛跑的模拟中,我们经常需要基于当前的赛跑状态(例如,兔子是否领先)来做出决策。使用条件语句(如 `if-else`)可以帮助我们根据不同的条件采取不同的行动。
3. **三元运算符的使用**:如您之前所询问的,题目中使用了条件(三元)运算符。这是一个简洁的方式,可以在一行中进行条件判断并返回一个值。
4. **数学模型的简化**:尽管我们可以通过完全模拟整个赛跑过程来解决问题,但在某些情况下,直接使用数学模型或算法可以简化问题并减少计算量。例如,我们可以通过数学计算直接确定乌龟和兔子在某个时间点的位置,而不是模拟他们每分钟的运动。
5. **编程细节和边界条件的处理**:注意兔子每10分钟检查一次,然后可能休息30分钟,这都可能影响赛跑的结果。处理这些细节和边界条件是确保程序正确性的关键。
6. **思维训练**:问题鼓励我们不仅仅思考如何编写代码来解决问题,还要考虑如何在给定的规则和条件下制定策略。这对于培养计算思维和解决实际问题的能力都是非常有益的。
总的来说,这道题目提供了一个典型的模拟场景,要求我们使用编程来模拟实际事件,并根据给定的规则和条件做出判断。通过解决这样的问题,我们可以加深对编程基本结构的理解,锻炼我们的逻辑思维,并提高解决实际问题的能力。