想來想去,不知應該寫甚麼,自己又懶,不做很多題目,今天忽發奇想,原來可以寫寫之前在TC打的Marathon,不但有很多經歷,好像中文的blog也甚少提及這個範疇。今次我會簡介Marathon是甚麼。
Marathon是一個類似OI入面open test data的問題一樣,沒有已知最好的答案,或是最優答案是一些指數級難度的問題。長度通常是兩個星期,有時也會是一個星期至一個月不等。提交的是一個program而已,會經過數百個test case(通常是random地循題目列明的方法generate出來的),再以題目訂明的方法計分,最後最高分的參加者勝出。
基本的program結構跟平時SRM的一樣,但Marathon提供更多測試的機會,可以大致分為四種︰
(1) 自己的offline testing︰和SRM或平時OI一樣,可以自己run自己的program,然後看看自己的表現。不同的是,通常Marathon提供一個Visualizer,可以用它來generate不同的random test case,大部份更可以有GUI的版面,把program的output化成一些動畫,迅速看到要改善的地方。我自己通常花大部份時間觀賞自己program的成果,的確是件很享受的事情。
(2) Example test︰和SRM一樣,Marathon會有一些seed(用來generate test data的random種子)來作一個簡單的測試。可以每15分鐘submit一次上去,出來的結果會是你program的每一個case的分數、運行時間、和一些debug的output之類。注意,這不是真的提交,不會用作真正的計分。
(3) Full submission︰這等同於SRM的submit,不過submit的時間不重要(即是越快submit不會越高分)。你的program會經過更多test case,不過你不能知道每個test case的表現,只知道最後得分的總和,以及相對其他參賽者的排名。
(4) System test︰顧名思義,是以你最後一個full submission作一個比較大型的testing。會run好多個case,而這個表現才是唯一會影響你最終排名的因素。
以上的僅是簡介,詳細可看Topcoder的規則。
之後我會說說我以往參賽的經驗,模式應該是這樣︰我會說說我的approach,然後再討論前幾名的approach,再重點提及一些重要的技巧,希望鼓勵大家參加,也給大家一些起步的建議。