记得很早之前刷这道题用的方法是:计算过了多少分钟局面会重新回到最开始,对输入的T取余,然后计算出每个时间段谁的路程更远,看取余后的T在哪个时间段,就是谁跑的快,然后有一些临界是路程相等的。只能说是个可行的办法,就是比较麻烦,涉及一些数学计算。
这次的思路和代码都简单很多:
一个循环遍历时间,分四种情况分别算
注意点:
前两个if必须在前面,因为是能决定这一分钟兔子是跑还是休息,当前这一分钟的路程和时间也要算上。
#include<iostream>
using namespace std;
int main() {
int T;
cin >> T;
int a = 0, b = 0;
//乌龟,兔子路程
int rest = 0, run = 0;
//兔子连续休息和跑步的时间
while (T > 0) {
a += 3;
//兔子发现乌龟更快,起来跑十分钟
if (rest == 0 && run == 0 && a >= b) {
run += 10;
}
//兔子更快,休息30分钟
if (rest == 0 && run == 0 && a < b) {
rest += 30;
}
//兔子跑
if (rest == 0 && run != 0) {
b += 9;
run--;
}
//兔子休息
if (rest != 0 && run == 0) {
rest--;
}
T--;
}
if (a > b) {
cout << "@_@ " << a;
}
else if (b > a) {
cout << "^_^ " << b;
}
else {
cout << "-_- " << b;
}
return 0;
}
T = int(input())
a, b, rest, run = 0, 0, 0, 0
# 乌龟 兔子 兔子休息 兔子跑
for i in range(T):
a += 3
if run == 0 and rest == 0:
# 发现乌龟快,跑十分钟
if a >= b:
run += 10
# 否则休息三十分钟
else:
rest += 30
# 休息
if rest != 0:
rest -= 1
# 跑步
else:
b += 9
run -= 1
if a > b:
print(f"@_@ {a}")
elif b > a:
print(f"^_^ {b}")
else:
print(f"-_- {b}")