語法書 / AA 競程語法書 上冊 / 第五單元 / 競程題目的組成要素

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)

有些題不是全對或全錯,而是根據答對多少子題而部分給分。這一區塊會說明怎樣拿到部分分。