[PTA]龟兔赛跑

题目描述

  • 题源:龟兔赛跑 - PTA
  • 题意:乌龟与兔子在同一起点、同一时刻沿环形跑道赛跑。乌龟以 \(3\text{ m/s}\) 匀速前进;兔子以 \(9\text{ m/s}\) 奔跑,但每隔 \(10\) 分钟回头观察一次:若此时已领先乌龟,则停下休息 \(30\) 分钟,否则继续跑 \(10\) 分钟。乌龟从不休息。求经过 \(T\) 分钟后谁跑得更远(乌龟@_@,兔子^_^,平局-_-),并输出较远者的距离。

题解1:以距离入手

简单直叙式模拟,无任何思维技巧。

#include <stdio.h>
int main() {
    int T;
    scanf("%d", &T);
    int t = 0; // 当前时刻
    int turtle = 0; // 乌龟距离
    int rabbit = 0; // 兔子距离
    int rest = 0; // 兔子剩余休息时间
    while (t < T) { // 累加模拟
        t++;
        turtle += 3;
        if (rest) rest--; // 兔子仍在休息
        else rabbit += 9; // 兔子不在休息
        if (t % 10 == 0 && !rest ) { // 每跑10分钟检查一次
            if (rabbit > turtle) rest = 30; // 从下一分钟开始休息30分钟
        }
    }
    if (rabbit > turtle)
        printf("^_^ %d", rabbit);
    else if (rabbit < turtle)
        printf("@_@ %d", turtle);
    else
        printf("-_- %d", rabbit);
    return 0;
}

题解2:以时间入手

我们暴力打表找规律,并将龟兔的时间-距离图像可视化,可观察到以 \(90\) 分钟为一周期。
在这里插入图片描述
于是我们只需将 \(T\)\(90\) 取模,再根据时间判断即可。注意此时需正确处理兔子距离,因为兔子的距离并非与时间成正比,因此不能用兔子的时间乘以兔子的速度!

#include <stdio.h>
int main() {
    int T;
    scanf("%d", &T);
    int rest = T % 90;
    if (rest == 0 || rest == 30 || rest == 45 || rest == 60) {
        printf("-_- %d\n", 3 * T);
    }
    else if ((rest > 0 && rest < 30) || (rest > 45 && rest < 60)) {
        printf("^_^ %d\n", (T / 90) * 270 + ((rest <= 10) ? 9LL * rest : (rest <= 40) ? 90LL : (rest <= 50) ? 90LL + 9LL * (rest - 40) : (rest <= 80) ? 180LL : 180LL + 9LL * (rest - 80)));
    }
    else if ((rest > 30 && rest < 45) || (rest > 60 && rest < 90)) {
        printf("@_@ %d\n", 3 * T);
    }
    return 0;
}

或者我们暴力模拟兔子距离即可,但此方法倒不如方法1,得不偿失,因此就不展示了。

posted @ 2025-11-09 22:16  椰萝Yerosius  阅读(0)  评论(0)    收藏  举报