語法書 / AA 競程語法書 上冊 / 第五單元 / 讀題與解題的 SOP

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=0n=1?)
  • 最大輸入是什麼?(n 達到上限時?)
  • 有沒有特殊情況?(所有數都相同、全是負數等)

記下這些邊界情況,待會寫完程式要測這些。


第 6 步:設計算法和資料結構(5-10 分鐘)

現在開始想怎麼解:

  • 大概的步驟是什麼?
  • 需要什麼資料結構?(陣列、vectormap…)
  • 複雜度大概是多少?(核對是否會 TLE)

不要急著寫程式。先在紙上畫畫、寫寫偽碼,確保邏輯清楚。


第 7 步:寫程式、測試、提交

這是真正寫程式的步驟。但寫完後,一定要測試

// 偽碼
#include <iostream>
using namespace std;

int main() {
    // 1. 讀入

    // 2. 處理

    // 3. 輸出

    return 0;
}

測試清單:

  • 用範例輸入測,結果對不對?
  • 用邊界情況測(n=0n=1n= 上限等),程式會不會 crash?
  • 輸出格式對不對?(有沒有多空格、少換行?)
  • 有沒有編譯警告?(雖然不影響執行,但警告通常代表 bug)

只有這些都過了,才提交。


讀題檢查清單

把這個清單列印出來或記在便條紙上,每道題都檢查:

□ 讀懂題目在幹嘛
□ 找到輸入格式
□ 找到範圍限制
□ 找到輸出格式
□ 用手推導範例,驗證理解
□ 想到 2-3 個邊界情況
□ 先想演算法,不急著寫程式
□ 用範例輸入測試
□ 用邊界情況測試
□ 檢查輸出格式(有沒有多空格、少換行)
□ 編譯無警告
□ 確認無 CE / RE / WA,才提交

常見讀題陷阱

陷阱 避免方法
只看題目描述,忽略輸入格式 一定要單獨找出「輸入格式」區塊
看完範例就開始寫,沒驗證理解 用手推導範例,看能否得到正確答案
沒注意範圍限制,導致整數溢位 看到數字就記下來,超過 2 \times 10^9long long
輸出格式錯誤(多空格、少換行) 逐字符檢查輸出要求,甚至可以把格式要求複製到註解
沒考慮邊界,WA 在 n=0n=1 寫完程式一定要測 n 的最小值和最大值
看不懂題目就胡亂寫,浪費時間 不懂就停,重新仔細讀,或看看有沒有更清楚的範例