5.2 競程題目的組成要素
競程題目不是一句話就完事。它包含很多不同的區塊,每個區塊都在告訴你不同的資訊。讀懂每個區塊,才能準確理解題目要求。
¶題目的 8 個組成部分
¶1. 題目名稱(Problem Name)
每道題都有一個標題。不要小看標題,有時候出題者會在標題裡放提示,有時候會用標題製造誘導。
例子:「A+B Problem」、「質數判定」、「最短路徑」
¶2. 題目描述(Problem Description)
用文字或數學式說明這道題要你做什麼。可能包含故事背景、數學定義、或者具體的計算要求。
例子:「請計算 a + b」或「給定一個無向圖和兩個節點,找出它們之間的最短路徑」
¶3. 輸入格式(Input Format)
精確說明測試資料長什麼樣。不是所有題都會清楚寫這一區塊,有些 OJ 會把它藏在題目描述裡。
重要:輸入格式 ≠ 題目描述。
- 描述可能只說「給你兩個整數」
- 輸入格式會說「第一行輸入一個整數 n,接下來 n 行各輸入兩個整數 a_i, b_i」
¶4. 範圍限制(Constraints)
告訴你所有輸入變數的範圍。這對選擇演算法和資料型態很重要。
例子:
- 1 \le n \le 100 — 資料量小,可以暴力
- 1 \le n \le 10^6 — 資料量大,不能暴力
- a, b 可以是負數
- 0 \le x < 2^{31} — 整數可能溢位,需要
long long
¶5. 輸出格式(Output Format)
指定你應該怎麼輸出答案。包括輸出的數字順序、是否換行、小數點位數等。
重要:有些 OJ 對輸出格式的要求很嚴格,有些則比較寬鬆。
例子:
- 「輸出一個整數」
- 「輸出 n 行,每行輸出一個整數」
- 「輸出一個實數,保留 2 位小數」
¶6. 範例輸入 / 輸出(Sample Input/Output)
提供一筆合法的輸入例子和對應的正確輸出。用來驗證你是否理解題目。
常見的有 1-3 筆範例,複雜題目可能會有 5-10 筆。
有些題還會提供「說明」,解釋為什麼這個輸入會對應這個輸出。
¶7. 時間限制與記憶體限制(Time Limit & Memory Limit)
告訴你程式必須在多久內執行完,以及最多能用多少記憶體。
時間限制常見值:
- 1-2 秒 — 可以接受 10^8 次簡單操作
- 3-5 秒 — 可以接受 10^8 \sim 10^9 次簡單操作
記憶體限制常見值:
- 64-256 MB — 適合大多數題目
重要:時間和記憶體限制是解題的關鍵。它們告訴你演算法的複雜度上限。
¶8. 給分方式(Scoring)
有些題不是全對或全錯,而是根據答對多少子題而部分給分。這一區塊會說明怎樣拿到部分分。