開啟章節選單
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"; } } }