之前說我這學期有參加程式競賽,那我就來說故事吧……
我從高中看到同學打程式比賽,還得到獎以後,就希望我哪天也可以參加,結果上了大學之後,學長卻告訴我,程式比賽都要 3 個人才能參加
三個人,一台電腦,幾個小時
---- 一個 PCCA 學長
然後我就一直想找隊友,可是都找不到。 交大有程式競賽的社團,叫做 PCCA,我在大一的時候去社團的教室裡繞一圈,想找另外兩個當隊友,結果卻是每個人都已經組好隊伍了
故事直接跳到大三,不要問為什麼,我高興就好。 到了三年級,通過基礎程式設計之後,我才敢再去思考程式競賽。 因為有一門選修課叫「競技程式設計」,所以我打算在修這門課的期間去比賽,可是上學期只開「競技程式設計二」,沒修一就修二我會怕,所以到三下修「競技程式設計一」才開始找隊友
我的(舊)導師告訴我,「競技程式設計」的作業很多,已經有幾個學生反映適應不良,想要停修,但是我相信,以我的熱忱,絕對沒問題
「競技程式設計」的第一堂課就是介紹「競技程式設計」到底會上什麼,所以很快就下課了,老師說,想要比賽的可以留在教室找隊友
說了這句話之後,教室裡一大半人都走了,只留下一個我(當時)認識的人,其他都是學弟妹。 我在講台處晃呀晃,一開始我只想找鄭n有 (怎麼又標不到人了?),想說都大三了,應該很難再找到人, 結果就找到一個頭髮很膨的學弟,在此先稱為學弟 A。 學弟 A 那時已經找到另一個隊友,在這裡叫做學弟 B
然後我就尷尬了,因為我已經找到另一人,鄭n有,而學弟 A 也已經找到另一人,這樣子組隊會變成 4 個人,違反比賽規則。 心中想,我必須要把其中一個人拆掉,這時學弟 A 和學弟 B 又說,他們去問另一個學弟,看他有沒有意願。 在那天晚上(競技程式設計是週五晚上的課),組隊又繼續成為問題
我還記得學弟 B 那時還叫我加他的 FB,但是我害怕認不出他,所以決定暫緩
很神奇的,我只看了學弟 A 兩次就認得他,然後就在物件導向程式的課加他 FB。 他那個時候,看到我都會呆呆的等我講話,然後我就會有一點尷尬,講不出話。(明明就超尷尬的,好不好) 但是,因為找不到隊友,我也只好硬著頭皮度過「緊張」時刻
第二次上課是兩個禮拜後,因為原本的上課時間,老師決定停課。 那天鄭n有到台上尋找隊友,他說「我是大三的老屁股」哈哈~
結果,沒有人要找我們 ;-(,因為競技程式設計只有很少的大三。 而且,學弟 A 跟我說,他們找到隊友了
競技程式的老師在上課時宣傳知名的程式競賽,有 ICPC、PTC、ITSA、……等。 PTC 大約每個月一次,ITSA 則可分為月賽和桂冠賽。 我聽到了之後就很想要來試試,就決定要報名 PTC,因為它是線上比賽
鄭n有說,可以找胡安鳳當隊友,他也有參加 PCCA,於是我就找他一起參加 PTC。 胡安鳳還找了他的好友林正偉,跟我組成一隊
比賽總共出了 5 題,但是我們只做了 2 題。 沒打比賽的可能看不懂我寫的東西,你們可以跳過這一段
第 1 題:題目說有 N 個工作,要分配給 X 台機器,一台機器一次只能做一個工作,每個工作只能給一台機器,但是工作的開始時間一定要照著測資給的順序,要回答 X 至少是多少,才能在 M 單位時間內完成工作
我們看到題目的時候,還以為要把它當作背包問題來解,我認為「背包問題是 NP 完全問題」,不能用這個方法解。 這時想著這好像「作業系統」的課提到的排程問題,然後就想要用 greedy (貪婪法) 來解。 原來我們漏掉題目的條件,這題一定要用 greedy 來解,因為工作不能改順序
第 2 題:給一個數列,詢問有幾個「山坡子序列」(hill subsequence),山坡序列是滿足遞增之後又遞減的數列,如 1, 2, 3, 4, 2, 1。
這題由我和胡安鳳寫程式。 我發現可以用動態規劃來計算遞增子序列的數量,然而直接算是 O(n²) 的時間,會花費太多時間,所以要用 BIT (樹狀數組)。 在寫程式的時候,我發現我總是在電腦前面想好久,因為同學的程式風格和我不同,要花時間理解它。 想到我用電腦的時候其他隊員就不能用,我的壓力就好大,我感覺還是手不要摸到鍵盤比較好。 不過寫好之後就 AC 了!
好像還有一題是 DNA 的編輯距離,一題是排列組合問題,可是我忘了題號。 DNA 的編輯距離那題,我覺得題意不清,決定不寫,排列組合問題則是賽後才想出來
我有一點覺得隊員想很慢,但是這樣子說好像太惡劣了,畢竟他們沒有為了比賽而準備
胡安鳳說我很厲害,都在 carry 他。 其實你也很棒,有你的 codebook,我才能快速寫題目。 至於林正偉,不,我忘了他做什麼了,我只記得我坐在地上想題目的時候,另外兩個隊員在討論
我還有好多要講的,可是要開學了,怎麼辦?
等開學之後,再來看續集吧~~