5.5 讀題與解題的 SOP
不同題目、不同 OJ 的題目格式差異很大。盲目開始寫程式,常常會掉進陷阱。這一節教你一套標準的讀題流程,確保不會漏掉任何細節。
¶7 步驟讀題法
¶第 1 步:快速掃描,了解題目在幹嘛(30 秒)
不要一字一字讀。先快速看:
- 題目名稱 — 猜測這題大概是什麼領域(數學、字串、圖論…)
- 題目描述的前 2 行 — 這題要我做什麼?
- 範例輸入 / 輸出 — 實際的數據長什麼樣?
如果題目太複雜,可以先跳過細節,進到下一步。
目標:5-10 秒內知道「這是一道什麼類型的題」。
¶第 2 步:找出輸入格式和範圍(1-2 分鐘)
現在仔細找:
- 輸入格式區塊(或在描述裡)
- 範圍限制(n 的上限、數值範圍等)
記下來:
- 有多少組輸入?
- 每組輸入是什麼樣的?
- 數值範圍是多少?(這決定了要不要用
long long)
這一步最重要,因為輸入格式決定了你怎麼寫 cin。
¶第 3 步:找出輸出格式(30 秒)
確認:
- 輸出幾行?
- 每行輸出什麼?
- 數字之間用什麼分隔(空格、逗號、還是換行)?
常見陷阱:題目說「輸出答案」,但沒說要換行。有些 OJ 會因為少一個 endl 而 WA。
¶第 4 步:看範例,驗證理解(2-3 分鐘)
拿著範例輸入和輸出:
- 用手算(或在紙上)推導:輸入怎樣變成輸出?
- 如果題目有「說明」區塊,仔細讀,確保自己理解對了
- 如果有多筆範例,一個一個驗證
目標:確保題意沒有誤解。如果推導不出範例的答案,說明理解有誤,回到第 1-3 步重新讀。
¶第 5 步:考慮邊界情況(1 分鐘)
想一下:
- 最小輸入是什麼?(n=0 或 n=1?)
- 最大輸入是什麼?(n 達到上限時?)
- 有沒有特殊情況?(所有數都相同、全是負數等)
記下這些邊界情況,待會寫完程式要測這些。
¶第 6 步:設計算法和資料結構(5-10 分鐘)
現在開始想怎麼解:
- 大概的步驟是什麼?
- 需要什麼資料結構?(陣列、
vector、map…) - 複雜度大概是多少?(核對是否會 TLE)
不要急著寫程式。先在紙上畫畫、寫寫偽碼,確保邏輯清楚。
¶第 7 步:寫程式、測試、提交
這是真正寫程式的步驟。但寫完後,一定要測試:
// 偽碼
#include <iostream>
using namespace std;
int main() {
// 1. 讀入
// 2. 處理
// 3. 輸出
return 0;
}
測試清單:
- 用範例輸入測,結果對不對?
- 用邊界情況測(n=0、n=1、n= 上限等),程式會不會 crash?
- 輸出格式對不對?(有沒有多空格、少換行?)
- 有沒有編譯警告?(雖然不影響執行,但警告通常代表 bug)
只有這些都過了,才提交。
¶讀題檢查清單
把這個清單列印出來或記在便條紙上,每道題都檢查:
□ 讀懂題目在幹嘛
□ 找到輸入格式
□ 找到範圍限制
□ 找到輸出格式
□ 用手推導範例,驗證理解
□ 想到 2-3 個邊界情況
□ 先想演算法,不急著寫程式
□ 用範例輸入測試
□ 用邊界情況測試
□ 檢查輸出格式(有沒有多空格、少換行)
□ 編譯無警告
□ 確認無 CE / RE / WA,才提交
¶常見讀題陷阱
| 陷阱 | 避免方法 |
|---|---|
| 只看題目描述,忽略輸入格式 | 一定要單獨找出「輸入格式」區塊 |
| 看完範例就開始寫,沒驗證理解 | 用手推導範例,看能否得到正確答案 |
| 沒注意範圍限制,導致整數溢位 | 看到數字就記下來,超過 2 \times 10^9 用 long long |
| 輸出格式錯誤(多空格、少換行) | 逐字符檢查輸出要求,甚至可以把格式要求複製到註解 |
| 沒考慮邊界,WA 在 n=0 或 n=1 | 寫完程式一定要測 n 的最小值和最大值 |
| 看不懂題目就胡亂寫,浪費時間 | 不懂就停,重新仔細讀,或看看有沒有更清楚的範例 |