不管在 Zerojudge、 Codeforces 等平台上有許多的練習題。這題題目都是由前人花很多時間準備出來的,但也因為出題成本的降低,因此常常出現題述未清楚標示或者測資有問題的題目。
下方是我在出了幾次題目,並且整合其它出題者的習慣整理而成的。下方會把一個題目的核心部分拆開,並且寫出每項應注意的事項,供您參考。
題述
- 中文排版請遵照中文文案排版指北
- 數學式請使用 Latex 語法,大部分的 OJ 都應該支援 Latex 語法
- 雖然常常出現只有一個英文代號的段落,但為了題述整齊請也使用 Latex 輸入
- 錯誤:第一行包含一個正整數 n。
- 正確:第一行包含一個正整數 $n$。
- 乘法符號為 $\cdot$ 或者 $\times$,不是 $*$
- 錯誤:$5*3=15$
- 正確:$5 \times 3 = 15$
- 正確:$5 \cdot 3 = 15$
- 雖然常常出現只有一個英文代號的段落,但為了題述整齊請也使用 Latex 輸入
- 輸入格式應清楚標示
- 不應使用例如「數字」、「數值」等模凌兩可模的詞
- 整數範圍 $(-\infty,\infty)$
- 正整數範圍 $[0,\infty)$
- 負整數範圍 $(\infty,0]$
- 假設第一行會輸入一個 $n \in [1, 100]$
- 錯誤:第一行輸入一個數字
- 錯誤:第一行輸入一個數值
- 錯誤:第一行輸入一個變數
- 正確:第一行輸入一個正整數
- 每行有幾個輸入,輸入是什麼格式(正整數、負整數、整數、小數)
- 每一個輸入對應到題述的意義務必要清楚標示
- 不應使用例如「數字」、「數值」等模凌兩可模的詞
- 測資範圍應清楚標示
- 假設輸入一個 $n \in [1, 2 \times 10^5]$
- 錯誤:$n$ 很大
- 錯誤:$n$ 為 int 裝的下的範圍
- 錯誤:$n \leq 2 \times 10^5$
- 正確:$1 \leq n \leq 2 \times 10^5$
- 使用到特定字串輸入,應寫明會有哪些字串。
- 假設輸入包含一個字串 $s$,代表 “add”, “query” 這兩個操作
- 正確:$s \in {\text{“add”}, \text{“query”}}$
- 假設輸入包含一個字串 $s$,代表 “add”, “query” 這兩個操作
- 假設輸入一個 $n \in [1, 2 \times 10^5]$
- 若題目為多筆測資一定要標示
- 例如 本題為多筆測資
- 若題目要使用特定的輸入做為結尾,請一定要標示
- 例如 輸入 $0$ 代表輸入結束
- 分段給分規則應清楚標示
- 若某一段測資有附加條件(例如需要通過範例測資),則應在配分欄標示
- 例如 附加條件:通過範測
- 每一段測資範圍應在配分欄標示
- 例如
- 測資範圍:$1 \leq n \leq 2 \times 10^5$
- 測資範圍:題目範圍
- 例如
- 若某一段測資有附加條件(例如需要通過範例測資),則應在配分欄標示
測資
- 需滿足題述的限制
- 例如 $n \leq 500$,那就不能出現 $n=501$ 的狀況,就算解答程式可以給出相對應的輸出也不行
- 一定要將題目給定的限制出滿
- 例如 $0 \leq n \leq 500$ 就至少要各有有一筆測資為 $n = 0$ 和 $n=500$。
- 假設有兩個主要變數 $n,m$ 則這兩個變數都應該要有最大和最小的組合
- 主要變數指的是會去變動到時間複雜度的參數
- 除非是特殊題目,否則測資數量不能太少。如果測資數量不夠很容易被特判
- 個人建議至少 $20$ 筆以上
- 如果需要分段給分,請確保每一個分段都有對應的測資
- 注意 IO 速度問題,太慢會 TLE
- IO 優化沒辦法保證所有寫題目的人都知道,如果題目需要 IO 優化才能過,則請自行斟酌
- 因為題目可能會有各種程式語言,IO 優化技巧請自行上網查詢
解答程式
- 至少需要有兩份完全獨立的解答程式可以得到相同的結果
- 最好是找到其它人幫忙驗題,如果沒有可以自行寫兩份解答驗證
- 如果有使用分段給分,至少每一種分段都寫一份程式碼,確定只能拿到對應的分數
- 在確定解答正確之後,可以試著修改程式,確定測資可以找出有錯誤的程式
小技巧
若一個題目為分段給分,則可以寫一份滿分的解答程式,再寫一份僅部份分的程式,則只需要比對部份分兩份解答是否一樣,大該就能確定解答的正確性。