# APCS實作題2022年10月第1題:巴士站牌 > 日期:2023年9月25日 > 作者:王一哲 > 題目來源:111年10月實作題第1題 > [ZeroJudge 題目連結](https://zerojudge.tw/ShowProblem?problemid=i428) <br /> ## 題目 ### 問題描述 平面上有 $n$ 個巴士站,第 $i$ 個巴士站的位置可以用座標點 $(x_i, y_i)$ 來表示。 兩個巴士站之間行進的時間是這兩個巴士站座標的曼哈頓距離。曼哈頓距離的定義如下: 對於兩個座標點 $(x_1, y_1)$ 與 $(x_2, y_2)$,兩點之間曼哈頓距離的為 $| x_1 - x_2 | + | y_1 - y_2|$。 你今天要從的巴士站 $1$ 坐車到巴士站 $n$,中間依序經過巴士站 $2, 3, 4, \dots, (n-1)$。 請計算過程中相鄰兩站的行進時間的**最大值**與**最小值**。 <br /> ### 輸入說明 第 $1$ 行有一個正整數 $n$ 表示路程中總共會經過幾個巴士站。 在輸入的第 $2$ 行到第 $n+1$ 行,每行有兩個整數標示巴士站的座標。 嚴格的說,輸入第 $i+1$ 行的兩個數字依序是 $x_i$ 和 $y_i$。 子題配分: - 60%:$n = 4$ 且 $-100 \leq x_i, y_i \leq 100$ - 40%:$4 \leq n \leq 100$ 且 $-100 \leq x_i, y_i \leq 100$ <br /> ### 輸出說明 在一行輸出兩個整數並以空格分開。 第一個整數表示相鄰兩站的行進時間的**最大值**。 第二個整數表示相鄰兩站的行進時間的**最小值**。 <br /> ### 範例一:輸入 ``` 4 1 1 1 3 4 5 2 6 ``` ### 範例一:正確輸出 ``` 5 2 ``` <br /> ### 範例二:輸入 ``` 4 1 2 -1 -1 1 3 0 0 ``` ### 範例二:正確輸出 ``` 6 4 ``` <br /> ## Python 程式碼 於 ZeroJudge 測試結果,最長運算時間約為 20 ms,使用記憶體最多約為 3.3 MB,通過測試。 ```python= n = int(input()) # 讀取站牌數量 minD, maxD = 10000, 0 # 儲存最短距離、最長距離用的變數 xp, yp = map(int, input().split()) # 讀取第1支站牌的位置 for _ in range(1, n): xc, yc = map(int, input().split()) # 依序讀取第2到n支站牌的位置 dis = abs(xc - xp) + abs(yc - yp) # 計算這支站牌與前一支站牌的距離 minD = min(minD, dis) # 更新最短距離 maxD = max(maxD, dis) # 更新最長距離 xp, yp = xc, yc # 更新前一支站牌的位置 print("{:d} {:d}".format(maxD, minD)) # 印出答案 ``` <br /><br /> ## C++ 程式碼 於 ZeroJudge 測試結果,最長運算時間約為 3 ms,使用記憶體最多約為 340 kB,通過測試。 ```cpp= #include <iostream> #include <algorithm> using namespace std; int main() { int n; cin >> n; // 讀取站牌數量 int minD = 10000, maxD = 0; // 儲存最短距離、最長距離用的變數 int xp, yp, xc, yc, dis; cin >> xp >> yp; // 讀取第1支站牌的位置 for(int i=1; i<n; i++) { cin >> xc >> yc; // 依序讀取第2到n支站牌的位置 dis = abs(xc - xp) + abs(yc - yp); // 計算這支站牌與前一支站牌的距離 minD = min(minD, dis); // 更新最短距離 maxD = max(maxD, dis); // 更新最長距離 xp = xc; yp = yc; // 更新前一支站牌的位置 } cout << maxD << " " << minD << endl; // 印出答案 return 0; } ``` <br /><br /> --- ###### tags:`APCS`、`Python`、`C++`