7-39 龜兔賽跑(C語言數學法)

Asura319發表於2017-12-02

這題的題面長這樣:

烏龜與兔子進行賽跑,跑場是一個矩型跑道,跑道邊可以隨地進行休息。烏龜每分鐘可以前進3米,兔子每分鐘前進9米;兔子嫌烏龜跑得慢,覺得肯定能跑贏烏龜,於是,每跑10分鐘回頭看一下烏龜,若發現自己超過烏龜,就在路邊休息,每次休息30分鐘,否則繼續跑10分鐘;而烏龜非常努力,一直跑,不休息。假定烏龜與兔子在同一起點同一時刻開始起跑,請問T分鐘後烏龜和兔子誰跑得快?

輸入格式:

輸入在一行中給出比賽時間T(分鐘)。

輸出格式:

在一行中輸出比賽的結果:烏龜贏輸出 @_@ ,兔子贏輸出 ^_^ ,平局則輸出 -_- ,後跟1空格,再輸出勝利者跑完的距離。

輸入樣例:
242

輸出樣例:
@_@ 726

分析一下題意:烏龜始終以 3m/min 的速度行進,而兔子的行進速度是 9m/min。兔子每次只會連續跑 10min,也就是 90m,如果兔子每次檢查發現烏龜落後了,就會連續休息 30min。在這 30min 中烏龜會行進 30min * 3m/min = 90m.

那末從第 0min 開始兔子和烏龜起跑,第 10min 時兔子行進了 90m,烏龜行進了 30m,這時候兔子比烏龜領先於是休息。烏龜和兔子的落差 60m,烏龜需要花 20min 的時間追平,於是在第 30min,烏龜和兔子的行進距離相等,都為 90m.
兔子在第 40min 時醒來,此時烏龜領先兔子 10min * 3m/min = 30m,這段路程差兔子追平需要的時間是 30m/(9m/min-3m/min) = 5min.

那末是不是說在第 45min 的時候龜兔賽跑完成了一個週期呢?注意到兔子在檢查到烏龜不落後於自己時會連續跑 10min,在第 45min 時兔子才跑出 5min,也就是說兔子在第 50min 才會停下來看一看烏龜在哪裡。

繼續推導就能得到這樣一張圖:
龜兔賽跑
橫軸每一小格表示 10min,紅線是兔子的行進路程,藍線是烏龜的行進路程。推導的結果是龜兔賽跑的週期是 90min,每個週期的第0、30、45、60、90min 是烏龜和兔子路程相等的時間點。剩下的事情就是簡單的對時間取餘和區間判斷了。

程式碼在下面:

#include <stdio.h>

int main() {
    int time = 0;
    scanf("%d", &time);
    getchar();

    int endDis = 0;
    // 週期 90 min 重複一次,也就是每 270 m 重複一次
    int circle = 270 * (time / 90);
    if (time%45 == 0 || time%30 == 0) {
        printf("-_-");  // 平局的情形,這裡把對90取餘得0、30、60處理成對30取餘得0
        endDis = time * 3;
    } else if (time%90 < 30 || (time%90 < 60 && time%90 > 45)) {
        printf("^_^");  // 兔子贏的區間,賽跑時間過了(time/90)個週期
        if (time%90 < 10) { endDis = (time%90)*9 + circle; }
        else if (time%90 < 30) { endDis = 90 + circle; }  // 兔子在睡覺
        else if (time%90 < 50) { endDis = (time%90 - 45)*9 + circle + 135; }
        else { endDis = circle + 180 }  // 兔子還是在睡覺
    } else {
        printf("@_@");  // 烏龜贏的情形,由於烏龜始終勻速行進,路程很好處理
        endDis = time * 3;
    }
    printf(" %d", endDis);

    return 0;
}

相關文章