這是對於競技程式 (Competitive Programming) 所做的介紹。
首先,什麼是競技程式?
競技程式 (以下簡稱競程) 是一個以程式設計與解題為重點的活動。參加者需要根據題目要求設計演算法,讀取指定的輸入並產生正確的輸出,同時還要考慮程式的執行效率,讓解法能在時間與記憶體限制內完成。
競程題目長怎樣?
競程題目會包含以下這些重要不可或缺的元素:
本體
題目的描述,通常會給你一個情境,跟你用文字敘述輸入會怎麼樣對應到輸出,你的目標就是要理解題目到底想要你對輸入進行怎麼樣的運算以及輸出什麼,並思考要如何讓解決的過程變得簡單。
輸入
輸入可能會長得像這樣:
, , ...
你看到的不會是這樣,而是像這樣的描述:
在第一行會有一個數字
第二行會有 個數字,分別為 , , ...
輸出
與輸入類似,他會給你一個描述,跟你講輸出的資料類型及數量
ex.
輸出一個字串 ,是經過?運算的結果
資料的範圍與限制
這個很重要,因為要算複雜度 (見 complexity) 來確定不會超時或是超過記憶體限制。
有些題目會在輸入的時候給你
ex.
在第一行會有一個數字 ()
第二行會有 個數字,分別為 , , ... ()
有些題目是多一個區塊給
ex.
資料範圍
對於
及 皆屬於int
這個區塊很重要,在一個水準之後你應該會體會到。
範例測資
會給你幾個示範的測資,讓你更容易理解題目表達的意思,有些會加上詳細的解釋,不一定有,這些一定得對才有機會是對的
通常長這樣:
Example input:
3 20 10 30Example output:
60
Online Judge
Online Judge (簡稱OJ) 是會有題目,讓你傳送程式,並會幫你用超級多測資測試程式,然後給你結果的平台
有很多 OJ 像是 Codeforces, AtCoder, CSES, ZeroJudge...
你可以在平台上看到題目,在你的電腦寫完並運行成功之後,傳送到 OJ ,有些可以貼程式碼,有些要傳檔案。
然後你會得到一個結果,下一個段落提到。
要注意到不是所有測資你都可以看到,有的時候你不會知道你的程式出錯是因為哪個測資錯誤,你只能知道是某一個答案錯誤,有些題目會有特別的測資容易錯。
程式運行結果
在你傳送到 OJ 之後,你會獲得一個結果,有這些
- AC (Accepted): 所有測資通過,該題成功解出
- WA (Wrong Answer): 有測資的輸出不正確,有可能是格式或是答案有誤
- TLE (Time Limit Exceeded): 程式花太多時間執行,解法看 complexity,也要記得優化 IO (starting template)
- MLE (Memory Limit Exceeded): 用太多記憶體,常見原因是因為遞迴一直增加新的元素沒有刪掉
- RE (Runtime Error): 在運行的過程中出問題,像是陣列越界、除以0等
- CE (Compilation Error): 編譯失敗,這個只要你有測試基本上不會發生
流程
解一個題目有很多的步驟,最簡單差不多像這樣:
- 讀懂題目,知道題目在講什麼,理解題目所有的步驟,注意到所有的細節
- 想解,這個會很難,有一些會用到特殊技巧的很難。所以不一定要一下子就想到最佳解,很多時候可以先想較差的解,然後想辦法優化
- 寫出來,這個部分應該是偏比較簡單的部分,尤其是在你熟悉常見的演算法寫法之後,但對初學者可以有點挑戰
- 測試,用題目的範例以及幾個自己想的測資測試
- 修改
- 提交
每個人都不一樣,夠厲害就照你自己的方法解,這是給初階的人用的
接下來
你已經知道競程是什麼了,接下來可以看 高中競賽 或是 相關資源 來了解要去哪練習或是有什麼目標可以前進,也可以直接看 Basics 章節的內容
Happy Coding!