如何出(改编)一道ACM算法题?
本文背景
本人算法能力一般,但是為省賽和區域賽網絡賽出過幾道題,總結了一些自己的經驗,希望與大家分享。本文不涉及具體的算法題,都是一些理論性的想法和一些建議。
題源
如果你能在沒有題源的情況下自己想出一道新的題目,想必也很難看到這篇文章了。題源是出題的第一步,相信到了需要出題的地步,正在看這篇博客的你一定有自己熟悉的刷題網站,而這個網站可以作為你的題源,因為熟悉。本人推薦兩個題源網站:
英文題源網站 Codeforce
中文題源網站 51nod
拿到的題源一定要確保自己能夠寫出所有解法,可能題目有O(n^2),O(nlog(n)),O(n)三種解法,如果有的話這三種解法你都要弄會,至少看了別人的答案后自己能夠完全透徹理解。
一道題有如下幾個組成部分,而作為出題者,關心的不只這幾部分:
題意改編
關于題意改編,也就是題目描述部分,以下提供四種策略:
輸入輸出改編
復雜度改編
以上為針對題目的修改,一定要確保搜索引擎沒法搜索到改好的題目。
如何生成樣例
生成輸入數據
一般我們需要20組左右的樣例,保存在文件中
生成輸出數據
將產生的20組輸入樣例在你的標準程序中,輸出結果在文件中,保存為輸出樣例。這里一定要保證你的標程的正確性,以及輸入輸出的合法性(符合題目描述)。
你需要將生成好的輸入輸出拿出一兩組放在題目描述中,當然你可以拿出特殊數據,讓參賽者 AC;也可以只拿出常規數據,讓做題者一直 WA。生成好的樣例規范命名,如下圖所示:
寫標程+OJ服務器實際運行
做完上面這幾部之后,一道題目基本上出完了,接下來你需要將這些數據和樣例在你們的OJ服務器上運行,確保時間,空間都符合要求。在測試中,你需要將你預想能通過的幾種復雜度的解法都在服務器上跑一遍,確保題目的解法可行性。
總結
本人大四的時候給省賽出了一道題目,并不難,但是數據處理等卡住了很多隊伍。
我認為讓一部分會高級操作、數據處理比較熟悉,或者對時間復雜度優化比較熟悉的題,有區分度的題才是好題。
需要卡住的是那些只會暴力解法的隊伍。
本人經驗分享結束,暫且只記得這么多了,后面可能還會更新。
希望讀這篇博客的你能出出一道讓自己和大家都滿意的題目。
本文聲明
本文并非鼓勵大家采用這種方法出題,本文想表達的是憑空造輪子很難,但是可以找到一個基本題,將起抽象出來,然后自己擴充,這個擴充也有一定的難度,可能也有新的idea,或者完全變成了另一道題,由出題者的能力決定,但是擴充比造輪子簡單很多,畢竟輪子不是人人能造。
如果你能力足夠強,雖然你很難看到此文,但是我仍希望文章中某個小建議能幫到你。
如果你能力一般,與我一樣在迫不得已的情況下需要出題,部分可以參考本文,還是希望你在此基礎上能靈感閃現,出幾道有靈魂的題。
當然,如果你并非在大型比賽出題,知識出題訓練,想整出大量的新題,本文可能對你有很大幫助。
發這篇文章的緣由是,這是我自己寫的筆記,后來發現網上沒有類似的,就發出來了,可能寫的不太好,但是我希望能幫到情況和我當時類似的人。
個人情感
我們學院沒有老師訓練acm,全靠我們幾個感興趣的自己在學。在我們偏遠的大西北,偏偏我們還是最好的學校,我們上上任院長比較有遠見,連續多年申請acm省賽舉辦資格,可能出于對偏遠地區考慮,我們還申請到了。但是我們沒有老師出題,沒有人帶,搞了個acm協會還經常拖欠經費,學院不肯花錢。照理我們確實沒有出題的資格,但是我們不想讓我們喜歡的東西,唯一的機會就這么消失掉,省賽只能硬著頭皮出題,區域賽邀請賽只能半自費去參加。
奇跡的是,我們那個院長還申請到了舉辦區域賽的資格,我們幾個既是后勤,又是技術維護,還是參賽人員。比賽的那幾天,每天都在修學校那些用了好多年破爛機器,學校各個部門見到沒收益都不做事,我們得到處跑,到處開證明,晚上基本上沒合眼。所以是通宵熬夜直接出現在賽場,賽前還要換件衣服當技術人員解決參賽者們的問題。
我描述這些只是表示,不是人人都有那么好的環境來訓練,還有很多和我一樣境遇的同學,我希望你們不要因為困難就放棄。我們學院沒老師,就學長帶學弟,獎牌都放協會,一代一代往下傳,后來者不埋怨我們這些學長什么都沒做,就足夠了。
也希望在艱苦環境中學習的ACMer大家不要放棄,總有人會你比更艱苦。如果你是先行者,你為學弟學妹們做的好事他們會記住;如果你是后來者,你要相信你的前幾屆已經做出很大努力了。
我已經大學畢業了正在考研,幾乎沒有機會再出現在賽場,但是算法是我感興趣的事物,我不會放棄,我會堅持學習下去。
謹以此文,與君共勉!
總結
以上是生活随笔為你收集整理的如何出(改编)一道ACM算法题?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces 1491 D. Z
- 下一篇: The new Era