Chapter I. 初來乍到
資訊競賽介紹
資訊競賽介紹
作者臺灣大學程式解題社
先備知識服用方法

什麼是資訊競賽?


讀者第一眼看到「資訊競賽」這個詞的時候,即便沒接觸過任何種類的資訊類型競賽,或許也會有一些對於資訊競賽的想像,此時可能有許多讀者會先想到像是「寫出一個應用程式」或是「駭客攻防戰」之類的競賽形式,如果是對資訊類型競賽稍微有些暸解的讀者,可能也會想到黑客松(Hackathon)或是資安類型的 CTF(Capture The Flag)等等比較為大眾所知的競賽類型。

那我們要提的資訊競賽到底是什麼呢?我們在打的資訊競賽也被稱作競技程式(Competitive Programming),顧名思義就是用寫程式的方式來比賽,但這字面上聽不出來跟「寫出一個應用程式」差別在哪。在一場競技程式的比賽中,選手的目的並不是寫出一套「給人使用的程式」,而是要「利用程式解決數道問題」,既然程式不是要給人用的,諸如做出好看好用的使用者介面這類為使用者著想的需求,並不在競技程式的考量之內,競技程式的目標是要「有效率且正確地解決問題」。

要與其他以「解決特定問題」為目標的競賽類型作出區別的話,在題目類型上,競技程式通常注重在演算法設計與實作上,因此也有人稱之為「演算法競賽」。講得通俗一點,感覺會有點像是在用程式解決數學問題,不過這些「數學問題」跟那些在國小、國高中課本上遇到的數學問題相比,通常更加複雜、變化更多,就像是在用程式玩益智遊戲。競技程式就像棋類活動一樣,是一種「心智上的運動」,選手享受的是利用邏輯解決問題的過程,只是多加上了用程式實作出來的部分而已。

何謂資訊競賽中的「題目」


再次強調,程式競賽中的題目與高中課程上要解決的計算題,可以說是非常不一樣!

這裡有一道範例題目,若稍微瀏覽一下的話,可以發現題目會有「問題描述」,除了講述題目本身外,資訊競賽常常會在題目上增加生活化、故事化的包裝,來讓資訊競賽與現實中有所連結。

在了解題目後,選手會需要了解這道題目的「輸入資料」,為了讓選手撰寫程式,輸入會遵循著固定的格式,並提供「測資限制」,來告訴選手輸入的資料會遵守這些限制,如此一來選手便能根據限制來規劃自己需要設計多有效率的演算法。

何謂效率呢?舉個簡單的例子,假設有個課程的期末考結束了,因為不會再上課了,所以學生想拿考卷的話只能去辦公室找老師拿。要是老師把所有學生的考卷都放在同一疊,當一個同學來拿考卷時,他就得要一張一張地看那一疊考卷,直到找到自己的考卷為止,但要是老師把學生們的考卷按照學號最後一個位數分成 10 疊,這樣當一個學生要來拿考卷的時候,他只要先看看自己學號最後一個位數是多少,再一張一張地看那一疊考卷,這樣他要看的考卷數量就是本來方法的十分之一!程式競賽要求的「效率」就是像這樣,用聰明的作法來加快解決問題的速度。

線上評測系統

而講到練習,資訊競賽的優勢就在於他能用電腦處理一切,也因此衍伸出了許多「自動評分」的方式。對此,網路上出現了許多不同的練習網站,他們被稱做「線上評測系統」,這些網站會存放不少資訊競賽的題目供資訊競賽選手自行練習,也不需要隨時有批改人員坐陣,選手們就能自行透過自動化的系統知道自己寫的程式是否有如期運作。

有許多有名的線上評測系統更是開發出了「積分制」的競賽環境,這讓選手們能夠時常與世界上的各種高手們競爭,也能夠更有效率的看見自己的成長,可以說是收穫成就感的好地方。

比賽


先前也提過,資訊競賽具有自動化批改的優勢在,所以在學術的競賽中,資訊競賽給人的刺激感是非常獨特的──這是因為選手在寫完程式的當下,就可以「上傳」程式碼並等候自動評測的結果,短時間內就可以馬上知道自己獲得的成績。

同時,由於成績能夠快速取得,資訊競賽還多出了「計分板」的文化,在許多的資訊競賽中,記錄著選手們解題狀況的「計分板」會公開給正在比賽的選手們看,讓選手們更加知道自己在競爭的對手狀況,進而增加比賽的緊張感。

觀看性

有了計分板文化後,比賽的觀看性也能跟著隨之出現。關注資訊競賽卻沒有參與其中的觀眾們也能透過計分板的狀況來關注競賽中的選手們。在更盛大的國際賽事中,也會有競賽直播的出現,尤其是在一個大會場看見世界各地好手齊聚一堂、腦力激盪數個小時的過程,還能透過計分板看見隊伍們激烈的競爭,排名翻轉再翻轉,這可是非常難以言喻的精彩。這裡提供國際大學生程式設計競賽 2019 年的直播作為參考。

升學、職涯保障


資訊競賽的練習需要花費大量時間,而參與的選手們往往都是還需要認真讀書的學生,在這樣的學習壓力下,就算富有熱情,單純將資訊競賽當成一種興趣也難以保障選手們的未來。

好加在,我們實際上是可以在資訊競賽獲得許多生涯規劃上的好處的!

升學相關

若你是一位想認真準備資訊競賽的高中生,參與各式大大小小的競賽理所當然的就能在學習歷程增添數筆佳績。而在資訊競賽學到的演算法與資料結構等知識,更是能與大學資工系的這些基礎課程做銜接,往往競賽選手們成功錄取大學資工系後,都能夠在相關課程上展現出學習上的優勢。

更厲害的是,經過升學制度不斷的改革,現在許多臺灣頂尖大學資工系都有開設特殊選才,在資訊競賽表現優異的選手同時也是展現了自己在演算法與資料結構的才能,當競賽足夠有公信力時,大學端便能透過這些成績看見選手們的表現,讓選手們在升學上多出一條選擇。

若更進一步地成為了臺灣資訊競賽圈的頂尖選手的話,甚至還能享有教育部所規劃的「奧林匹亞升學優待條款」,進而獲得保送大學的機會。

職涯相關

若你是一位想認真準備資訊競賽的大學生,也許在你的大學課程存在著學習「演算法與資料結構」的規劃,那麼參與「國際大學生程式設計競賽(International Collegiate Programming Contest,簡稱 ICPC)」便能完美地鞏固你的這些知識點!

不只如此,由於 ICPC 還是一個三人一組的團體競賽,在比賽過程中,你會學到團體合作、溝通的方法,你會學到在短時間內精準的寫出程式碼的技巧,這些能力在未來的職場上可都有著不小的優勢。

而講到工作上的面試,就不得不提到「白板題文化」。有許多的科技公司在開出軟體工程師的職缺時,都會規劃所謂的「白板題」作為面試關卡,其內容通常便是要你在面試當下對著面試官講述一道「資訊題目」的解法,甚至寫出一段程式碼實現你的解法。若是參加過資訊競賽的老手,業界中的白板題可以說幾乎都是相對競賽簡單許多的題目,與面試官講述解法的過程也可以從與隊友的溝通中培養,而在壓力下寫程式的能力更又已經被競賽訓練過了!可以說是獲益良多。