開啟章節選單

12970 Alcoholic Pilots

題目連結

題目敘述

在某次搭飛機的旅途中,Mr. Ed 發現機長的廣播聽起來像是喝醉了。更糟的是,這些醉醺醺的機師之間還在比賽,看誰能更快抵達最近的機場。Mr. Ed 聽見兩位機師透過無線電互相喊話、交換各自的飛行速度與與機場的距離,甚至說:「如果我先到,你就欠我一杯啤酒!」

雖然最後 Mr. Ed 平安無事,但你現在好奇,到底誰贏了這場比賽,以及他們兩人的平均抵達時間是多少。

你會獲得兩架飛機的速度與距離。假設飛機全程都維持相同速度,請你判斷誰贏得了比賽,並輸出兩架飛機的平均抵達時間(以最簡分數或整數形式表示)。

輸入格式

每筆測資為一行,包含四個整數 v1 d1 v2 d2 :

  • Mr. Ed 所在飛機的速度與距離。
  • 機長正在比賽的那架飛機的速度與距離。

1 ≤ v1, d1, v2, d2 ≤ 10⁹

輸入以一行 0 0 0 0 結尾,表示輸入結束。

輸出格式

對每筆測資,輸出兩行:

  • 若機長贏得比賽,輸出:Case #X: You owe me a beer!

否則輸出:Case #X: No beer for the captain. 其中 X 是測資編號,從 1 開始。

  • 接著輸出平均抵達時間,格式為:Avg. arrival time: Y

若平均時間為整數,直接輸出整數 Y

否則輸出簡化後的分數形式 x/y

解題思路

先通分比較分子,並找最大公因數化簡

程式碼

#include<bits/stdc++.h>
using namespace std;

long long gcd(long long a, long long b) {
    if (b == 0) {
        return a;
    }else {
        return gcd(b, a % b);
    }
}

int main() {
    long long ra, da, rb, db, c = 0;
    while (cin >> ra >> da >> rb >> db && (ra || da || rb || db)) {
        c++;
        long long ta = da * rb, tb = db * ra;
        cout << "Case #" << c <<": ";
        if (ta < tb) {
            cout << "You owe me a beer!\n";
        }else {
            cout << "No beer for the captain.\n";
        }
        cout << "Avg. arrival time: ";
        long long a = (ra * db) + (rb *da), b = 2 * ra * rb;
        long long f = gcd(a, b);
        a /= f, b /= f;
        if (b == 1) {
            cout << a << "\n";
        }else {
            cout << a << "/" << b << "\n";
        }
    }
}