第五屆全國科大程式競賽心得 - 金獎(5th)心得

僅此紀錄 2020/07/08 第五屆全國科大程式競賽心得。
「紀錄每個時刻,讓未來的自己不遺忘過去的自己」
只有自己才能體會自己的過去
獲得了第五屆全國科大程式競賽金獎 (5th)
此心得並不包含解題,將額外再另外一篇特別說明

名詞解釋

  • 駕駛
    Coding、上機寫程式
  • 駕駛員
    駕駛的人員,駕駛為上述意思

比賽前的規劃

比賽前,其實我們每周的一、六晚上都會花 3 小時來學習或複習新的演算法,Bill and Entroy 負責思考題目,當他們將題目思考完畢後交予給我進行 Coding ,看到這裡?有些人可能會有疑惑,那這樣是不是因為我太爛才會讓我來負責寫程式呢?其實不然,主要負責上機寫程式勢必要能夠最快速理解題目與隊友的想法,並抓出隊友的思考盲點並給予想法討論,直到我們想法達成共識後,我在進行 Coding 。

這樣有兩個好處,第一,由於我會與負責思考題目者進行想法討論,有時可以注意到題目思考者沒有注意到的細節,而不導致題目思考者在寫程式寫到一半時或 debug 時才發現自己想法上的漏洞。第二,我們其實有思考過一策略為每個人各自解題,會的就上機撰寫的模式。但我認為每個人都獨自在進行一個解題週期過於浪費時間,也容易使隊友感到疲乏,為甚麼呢?我定義的解題週期如下:

  1. 看懂題目 -> 閱讀能力
  2. 提出想法 -> 透過過去的演算法知識進行思考
  3. 思考可行性 -> 程式會不會太難寫、我是不是沒有注意到一些細節
  4. 上機撰寫 -> 開始進行撰寫、Debug
  5. 解題成功 -> 上傳後 AC

我個人在解題目的經驗中,要自己再不休息的情況中重複解題週期至 4 題其實就已經感到疲憊,而其中要是在第四點才發現到一些重大問題時往往需要再回到第三點再來思考到底可不可行,對於腦袋會感到相當的疲憊,於是第二好處則是可以減少每個人的疲憊感,由於每個人進行專業分工了,大家只要在自己所負責的那項做好自己的工作就好,就能完美的分工完成解題週期。但第四點的執行者通常抗壓性要是最大、撰寫程式的能力必須要是全隊最優秀的。

到底要當天去呢?還是提前一天去呢

先說結論好了,提前一天去。因為我沒去過雲林阿,當然會想要去雲林看看搂。不過其實路途費比我想像的便宜住宿費只要 1280 元(3人房),高鐵來回票也只要 1160元,有種突然覺得國內旅遊好便宜(不過雲林好像也沒什麼好玩的?哈哈哈哈),也能給自己一天休息的機會,不會因為比賽早上睡過頭而導致特別敢的狀況發生在2018 (107) 學年金手獎技藝競賽程式設計 - 金手第六心得那次印象真的很深刻阿QQ。

  • 出發至雲林高鐵站

比賽前一天,緊張的前夕

漂亮的高鐵 and 疑? 沒有公車嘛!?

我與隊友們相約在台北車站的南3門,大家都不太會迷路花蠻快的時間就找到了,不愧都讀北科,哈哈哈哈。我們透過高鐵到雲林時已經是 11:39 ,不得不說的是雲林高鐵站真的很漂亮,頗有機場的感覺,雲林縣政府讚讚,但是外面好荒涼QQ,我原本以為會是很熱鬧的地方結果沒有阿,公車客運也不像台北一樣方便,他們的公車反而不太像是公車是路與路之間的距離就一站,比較像是鎮與鎮的距離一站,有夠遠的…。

路途中的小插曲

後來我們搭計程車從雲林高鐵站到民宿(近虎尾科技大學,布拉格民宿),這裡有一點跟台北不太一樣,台北的計程車是 70 元開始跳表,但雲林是從 100 開始,一開始有種心痛感,不過因為司機態度蠻不錯的,所以其時多給 30 元我還是可以接受拉,然後搭計程車其實感覺很不錯跟在台北搭計程車的感覺不同,離開了水泥叢林,到了田野間的地方,看著一路上的風景心情也不自覺得好了起來。

抵達民宿大約為 200 元,司機也提醒我說以後可以直接說到家樂福(民宿對面),司機們都比較好知道地點在倆,到達民宿後我才發現我們可以入房的時間為下午 4 點阿,可是現在的時間是下午 1 點阿,這中間 3 個小時我要怎麼辦阿阿阿阿,這提醒以後的我以後住民宿必須先問幾點可以入住,不然的話就會發生跟我一樣的窘境QQ。

小女孩是全世界最可愛的了!

幸好客服人員願意先讓我們把行李先寄放在民宿那不然我們就要拖著行李箱到處流浪了 ಥ⌣ಥ,樓下有很多夾娃娃機店,其中竟然有一個是夾蓮蓬頭的!有夠酷的,竟然還被我花 10 元夾到我超開心的而且雲林的夾娃娃機店可以夾一堆東西!例如:泡麵、舒跑…等。

但是雲林的夾娃娃機店比便利商店還多很多害我很意外,還是雲林人如果家裡沒東西都是跑去夾娃娃機夾而不是去便利商店買阿XD。然後雲林縣立仁國小校舍好漂亮阿,害我也好想進去裡面就讀,然後小女孩真的是世界上最可愛的生物了٩(^ᴗ^)۶,不管是哪裡的小女孩。

看完虎尾反觀北科?

之後我們走到虎尾科技大學去參訪,虎尾科大比起台北科大來說大了許多,北科看起來真的就像小學一樣,而且他們還可以把機車停到校園裡面去真的是太棒了!北科甚麼時候也要跟進阿,外面的停車位還有夠難找的,我的愛車都被刮了 n 遍了 ಠ︵ಠ。不過他們廁所我覺得就沒有比北科好了,我們北科的廁所真的是非常漂亮 and 非常乾淨阿!每間廁所還都會有衛生紙,要是希望自己的廁所 always 都是乾淨的就來讀北科大吧!(業配),開玩笑這是我的 Blog 幹嘛還要業配阿。

雲林的夜生活

回來的路上我們還去 KTV 唱歌 and 喝酒,這在高中的我不可能會這樣做的,考前就是要完全的嚴肅和認真準備阿,不過我的兩個隊友似乎不這麼覺得,來比賽還是要來體驗一下雲林的生活阿。我這次竟然下來雲林都沒有看程式阿…,罪惡感好重,不過 Entroy 唱歌真的很好聽,找他唱歌真得棒。

我們住的套房似乎是愛情套房,一進來就有一隻粉紅大熊,好可愛,我一直抱著他好想就這樣把她帶回家喔,對於分手後的我算是很大的精神安慰了 ಠ︵ಠ,然後這次睡覺我還搶了 Bill 的棉被QQ,對不起,我下次會意識到我睡覺會搶棉被得我也會注意下次在外面住雙人房時先跟客房人員要兩件棉被,辛苦你了嗚嗚嗚嗚嗚嗚。

  • 可愛的粉紅大熊

比賽當天,想法與思考的碰撞

開幕式

比賽當天,我們先在虎尾科大資訊大樓外進行報到,之後進到階梯教室等待開幕式,其中開幕式的主辦單位曾說我們這比賽能夠讓一些無法勝過台清交成的科大學校也有機會得名次,當下真得是超級感動的 ಥ⌣ಥ,然後中午的便當我覺得還不錯吃只是飯有點乾再用筷子時不太方便,我也喝了能量飲料,希望能夠將自己體力充足在考試期間不會因為疲累而寫不好,但是能量飲料 75 元真的太貴了拉。

  • 比賽隊伍

甚麼 notebook 只能10頁!

我們在開幕時,接受到一個訊息是我們的筆記只能夠有 10 頁,但是我們準備了 20 頁阿!所以我們直接在當場臨時進行刪除大法,有夠緊張的。還因為沒有 latex 導致沒辦法快速生成 pdf,幸好後來 Entroy 急中生智用 online linux 來解決此危機,不然就要出事啦!

比賽前的緊張

當我們進去比賽的電腦教室,我發現到我周遭的其他隊們都非常吵鬧,給予我一種非常緊張的感覺,有種覺得自己是不是因為準備不足才會這麼緊張?但其實我這麼緊張也是合理的,畢竟我連歷屆試題都只有寫 4 題,肯定會緊張的吧!當下的自己只希望能夠盡量讓自己發揮自己的本事就好,不過 scoreboard 就在我的面前壓力還真的是挺大的XD。

考試時的小插曲

時間到,每隊開始準備進入解題環境時卻沒辦法進入,每隊幾乎都出現一個狀況為「比賽已開始,你需要輸入特定指令才能進入比賽」之類的狀況,幸好很快就解決,不到 10 mins ,主辦單位就將每台電腦輸入指令讓大家都能繼續比賽,不得不說主辦單位還挺不賴的。

比賽開始了,顯現自己實力的時候到了!

比賽的過程中,我開始負責駕駛,其他隊友開始進行解決與思考題目,我們在解題的過程中,一開始順利地解開 4 題。其中一開始我對於讀取一行字串中所有的數字是想用 stringstream 但我卻對那語法忘記不熟,如果再查會太浪費時間,後來 Entroy 想到用 getchar() 來解決這個問題真的是聰明,度過了最一開始的危機。

在最後的 90 分鐘,突然我腦袋異常清醒,告訴我自己現在正是你要發揮、拯救團隊的時候,將自己所學的知識都運用上、放手一搏吧!

在剩下 1 hr 30 min,開始卡關,有兩題並不難的題目卡關,其中 ProblemB 關於遞迴因為解不開,導致隊友開始設想要使用暴力解法,直接建立答案表,就可以達到 \( O(1)\),原本這想法我有嘗試著跟他們溝通這想法並不好,因為我們有看到其他隊在解此題都特別快,只有我們卡關,所以我一直覺得是我們缺少了哪部分的想法,才會使我們一直 WA。

但是隊友有點不太能夠聽進我的想法,一直以自己的角度去思考,認為我們只要能夠把題目解開就好,所花費的時間成本再多都沒關係。結果則是發現實現上具有根本上的問題,所以不可以使用,後來我在最後半小時急中生智想到有可能是因為題目說數字最大只會到 \(2^{32}\),但並沒有說中間計算時不會超過,於是我就使用 long long 解決了這問題,在危險中找到出路。

另外一題卡關的部分,就是 Problem C 題目是想要對樹進行追蹤,我第一直覺就是樹壓縮成一維陣列,然後再將資料向下延伸找回,Bill 的想法似乎跟我一樣,但他的想法我覺得錯誤了,他寫成一個 struct ,有點類似於線段樹,但其實不用那麼麻煩,我們後來在實現此方法時發現非常不友善,程式會花費太多時間。

後來我的另外兩位隊友想用 struct + pointer 來解決問題,當下的我聽到時是十分震驚的,因為我覺得這是個瘋狂的舉動,在比賽的時候寫 pointer 不確定性太大、Debug 時不方便,在不容易知道自己問題會在哪部分的情況下,不應該要用 pointer,在他們後來發現不可行後。根據我的想法將樹壓縮一維陣列並透過遞迴實現,透過 Bill and Entroy 在我旁邊 Debug 與檢查錯誤讓我們在最後半小時內也對了這題,隊友也是很重要的!

比賽結束了,名次到底是第幾呢

由於最後一小時比賽會凍結排名,我們最後一次看到我們自己的成績是第 17 名,我非常緊張,感覺這樣有失自己的自尊,不過後來有在最後半小時解出兩題,應該名次會往前,當時的猜測是自己會是第五名 or 第六名,因為都是比較晚的時間送出應該會成績不會太漂亮,果不其然,跟我的預估一樣拿到第五名、金獎。而且金獎還是最後一個名額阿,運氣真的很好。也謝謝自己的隊友可以幫助我能夠拿到金獎,沒有他們我說不定連金獎也都沒有吧!

  • 頒獎拉,金獎的我們

  • 很乖的 Entroy

賽後,回歸的旅途總是讓人疲憊

我在比完賽後,認識到了一位就讀虎尾科大的工作人員,原因是因為我們在最後半小時成功解出兩題時太激動,才會不小心認識到的XD,對不起啦我下次不會那麼激動的QQ,而且他們個性也都很好願意可以讓我們將程式碼帶回來做檢討跟讓我放在 Blog 可以讓未來的我觀看,也讓她告訴我哪裡有好吃的,真的,認識新朋友的感覺真的很棒。但是我們都在互嘴,哈哈哈哈

由於閉幕式後,我們的高鐵是晚上 9 點,但時間才 5 點,於是我們去虎尾附近逛逛,不得不說其實虎尾的路很大條、很好走,車流量也不多挺舒服的。但是我們在比賽的過程中卻收到空汙警報,讓我覺得這裡的人好可憐阿QQ,希望台灣的每個工廠與人們都能有良心,守護好台灣人的健康與生態環境。

最後回到高鐵站時,我與 Bill 在虎尾高鐵站外走走聊天,晚上的雲林其實空氣挺不錯的,而且讓我對雲林的印象很加分,東西好吃、便宜,人也都蠻熱情、計程車司機們也都很友善,讓我很喜歡這裡的人事物,突然有種不想回台北的感覺呢!

  • 晚間的雲林高鐵站
  • 返程的高鐵車票

浪漫的情話

我在回程的過程中,突然想到一段話,如下:
A: 北港在嘉義,那南港在哪裡呢?
B: 台北嗎?
A: 而我現在就在中間當南港與北港的橋梁,把南北港的思念相互傳達到彼此。

天阿,自己真的好浪漫喔,哈哈哈哈。神經病

賽後檢討

每次的比賽都需要檢討才能讓自己更完美,我個人在這次賽後有想要提出一些檢討,如下:

  1. 相信駕駛員的判斷、信任駕駛員
    為甚麼會這樣說呢?因為我覺得我在這次比賽時發現一個問題,如果想法者思考錯誤時他並不會發現錯誤,但當駕駛員無法在當下提出有力證據時,容易造成衝突,勢必要給想法者去實際駕駛一遍才能夠讓他理會,但是這樣可能會浪費多餘時間。但我也無法保證駕駛員是對的,所以駕駛員必須學會一件事情就是,要是自己沒有足夠的把握就不要否定他人想法。
  2. 練習時,盡量讓想法者也可以寫些題目
    因為想法者在思考題目時,大多只有思考重點的想法,忽略掉一些小細節,而往往魔鬼藏在細節裡,常常都是因為細節而讓 Coding 變得窒礙難行,或是在原本完整的程式必須要加上現在才發現的細節但卻沒有空間讓程式修改,所造成的麻煩,於是建議隊友都能寫一些來了解題目,不需要很多。比例大約駕駛員 4 : 想法者 1 即可。
  3. 需要有副駕駛員
    駕駛員思考的路上真的會累,需要有第二人來輪替會更好。
  4. 需要更多練習
    我們練習的時間真的不夠多,科大程式競賽歷屆試題連完整的一年都沒有實際寫過。下次要把他寫完
  5. 不要看到太漂亮的女生就呆住
    容易今天戀愛,今天失戀。真的好難過QQ,但是皮膚白白的女生真的好可愛 (◍•ᴗ•◍)❤️
  6. 團隊氣氛更好
    這點 Bill 做得還不錯,很感謝他 ಥ⌣ಥ
  7. 必須先詢問民宿幾點可以入住
  8. 如果睡雙人床準備兩個棉被QQ

希望我的未來能夠變得更好,與我的夥伴朋友共同努力。

後記

也感謝系主任願意補助我經費讓我去參加比賽,讓我無後顧之憂放心大膽一博。然後與我無關真的好好聽,我聽了 4 小時都不會膩,打這篇心得也花了我 4 小時跟打比賽一樣久呢!不說了要去睡覺了拉,下台一鞠躬。

競賽結凍後的總成績

金獎

第五名

北科資財官網恭賀得獎

  • 版權聲明: 本部落格所有文章除有特別聲明外,均採用 Apache License 2.0 許可協議。轉載請註明出處!
  • © 2020-2024 John Doe
  • Powered by Hexo Theme Ayer
  • PV: UV: