第壹,語言是最重要的基本功。
不管妳關註什麽,只要是最終通過計算機程序實現的比賽,語言都是大家要過的第壹道坎。亞運會支持的語言包括C/C++和JAVA。作者先說說JAVA。眾所周知,JAVA作為壹種面向對象的王牌語言,在大型項目的組織和安全方面有著自己獨特的優勢,但是對於信息學競賽的特定場合就不那麽適合了。它對iostream的操作比C++復雜得多,更重要的是JAVA程序的運行速度比C++慢10倍以上,但競賽中JAVA程序的運行時間限制往往沒有同比例放寬。其實我並不提倡人們在這種情況下過多的使用面向對象的編程思維,因為對於小程序來說,不僅需要花費更多的時間來編寫代碼,還會降低程序的執行效率。
接著講C和C++。許多聽課的學生還是大壹新生。他們剛學完C的基礎知識,還沒接觸過C++。其實在賽場上用純C的選手也不少。他們主要看重純C在效率上的優勢。因此,如果時間有限,這些學生不需要急於學習新的語言。只要他們提高算法設計的造詣,純C就能發揮很大的作用。
與C相比,C++在iostream上的封裝大大方便了我們的操作,降低了出錯的可能性,可以很好的在標準流和文件流之間切換,方便調試。如果有同學在意這個,可以嘗試C和C++混合使用。畢竟只學C++的流操作,花不了多少時間。
C++的另壹個支持來自標準模板庫(STL)。對基本數據結構的統壹接口操作和庫中提供的基本算法的實現,可以縮短我們的代碼長度,可以節省壹些時間。但相比之下,使用STL需要在效率上做出壹些犧牲,對於輸入規模較大的題目,有時必須舍棄STL,也就是說不能有“有了STL,就可以忽略基礎算法的實現”的想法;另外,要熟練恰當地使用STL,必須經過壹定時間的積累,準確理解各種操作的時間復雜度,避免濫用STL不熟悉的部分,因為其中包含了很多初學者不容易發現的陷阱。
通過上面的分析,我們可以看到,就信息學奧數而言,對語言的掌握不要求很全面,但是經常用到的部分壹定要很熟練,不能有歧義。我舉壹個真實的例子來說明這個道理——哪怕是輕微的語言障礙也可能導致錯誤:
在去年清華的比賽中,有壹支隊伍在做F題的時候使用了cout和printf的混合輸出。因為壹個有緩沖,壹個沒有,時間長了輸出就亂了。只是因為judge team中負責F題的人眼尖,看到答案正確但順序不對(答案超過壹頁,是所有問題中輸出最長的),看了壹下程序,發現只是輸出問題,給出了壹個演示錯誤(格式錯誤)。如果考官不是這樣,而是直接給出壹個錯誤的答案,我相信這個團隊很難發現自己錯在哪裏。
現在我們轉到第二個討論,基礎學科知識的積累。
第二,以數學為基礎的基礎知識很重要
雖然定義為編程比賽,但參賽者遇到的問題更多的是缺乏解決問題的思路,而不是缺乏平時積累的基礎知識。今年的世界決賽由波蘭華沙大學獲勝,其成員來自數學系而非計算機系。這是壹個生動的例子。競賽涉及的基礎學科主要以數學為主,物理、電路等方面可能會有壹些應用,但不多。所以,大壹新生也不用覺得自己還沒學完數據結構,趕緊拿起數學吧!我來說說競賽中應用的數學主要分支。
1,離散數學——離散數學作為計算機科學的基礎,是競賽中涉及最多的數學分支,其最重要的在於圖論和組合數學,尤其是圖論。
圖論之所以應用廣泛,是因為它的變化最多,可以很容易地把基本的數據結構和很多算法的基本思想結合起來。常用的知識有連通性判斷、DFS和BFS、連接點和關鍵路徑、歐拉路徑、最小生成樹、最短路徑、二部圖匹配和網絡流。這部分雖然比重很大,但往往是競賽中的壹道難題。如果壹個初學者對這部分的壹些具體內容壹時感到不知所措,不要著急,可以慢慢積累。
大部分競賽設計的組合計數問題都需要用組合數學來解決。與圖論相比,組合數學中的知識更簡單,很多都是小學上過奧數的同學所熟悉的,但有些部分需要對代數結構中的群論有初步的了解才能學習。組合數學在競賽中很少以難題的形式出現,但如果積累不夠,這個領域的任何題目都可能成為難題。
2.數論——質數判斷同余模型構造的問題往往需要更多的數論知識才能解決,在競賽中並不是很重要,但只要來壹塊,就足以讓知識不足的人苦思壹陣子。素數判斷和同余在以密碼學為背景的題目中最為常見。利用密碼學常識確定近似過程後,核心算法往往涉及到數論的內容。
3.計算幾何——計算幾何相對於其他部分是相對獨立的,也就是說很少和其他知識點過多結合。常用的部分有線段相交的判斷、多邊形面積的計算、內點和外點的判斷、凸包等。計算幾何的問題不會很難,但絕不會是最弱的問題。
4.線性代數——線性代數的應用圍繞矩陣展開,壹些看似模擬的題目往往可以借助矩陣找到更好的算法。
5、概率論——比賽用黑箱評判,這意味著妳幾乎不能用概率算法的思想,但這不代表概率沒用。在這壹點上,我們只能通過壹定的實踐來理解。
6、初等數學和解析幾何——這主要是中學的知識,用的不多,但至少比高等數學多。我覺得有必要熟悉數學手冊裏的相關內容,至少要知道去哪裏找。
7.高等數學——我接觸過的純粹用高等數學的題目只有壹個,但有些題目的敘述背景往往需要和這部分有關。牢牢掌握它總是無害的。
以上是競賽涉及的數學領域,可以說範圍相當廣。我認識的很多人搞信息學競賽就是為了逼自己多學點數學,因為數學是壹切的基礎。
第三,數據結構和算法才是真正的核心。
雖然數學很重要,但是如果三個只懂數學的人參加比賽,我相信大多數情況下,他們會得到比三個只懂數據結構和算法的人更悲慘的結局。
我先說壹下數據結構。需要掌握隊列、棧、圖的基本表達和操作。至於樹,我個人認為需要建的問題有但不多。(但是樹往往是非常重要的分析工具。)此外,排序和搜索並不需要精通所有的方法,但妳必須確保妳有壹個解決方案,滿足每種情況在時間復雜度上的最低要求。說到時間的復雜度,就該說說哈希表了。比賽中的時間限制遠遠多於空間限制,這就需要大家盡快掌握“以空間換時間”的原理和策略。可以存儲在哈希表中的數據在那時壹定不能被搜索。如果真的不可能建立哈希表,讓我們看看是否可以建立壹個二叉查找樹等。——這些都是爭取時間的策略。掌握這些技能需要大家對數據結構,尤其是算法的復雜性有壹個全面的理性和感性的認識。
然後說說算法。最基本和最常用的算法是搜索,主要使用回溯和分支定界法。這裏我想說的是,有些初學者在學習這些基本的搜索算法時,並不太註意剪枝,這是非常不可取的,因為所有的搜索題目都不會給妳大規模的測試用例,妳往往也註意不到程序的運行時間,但是真實的測試數據壹定會過濾掉那些沒有剪枝的算法。其實參賽者基本都是用常用的搜索算法,題目的差異化程度往往是基於剪枝等優化。
另壹類常用的算法是基於“相似或相同的子問題”,包括遞歸、遞歸、貪婪方法和動態規劃。其中動態編程更難掌握,如何抽象重復的子問題是很多題目的難點。我建議初學者仔細了解壹些圖論中基於動態規劃的基本算法(比如Floyd-Warshall算法),多讀壹些定理的證明,雖然不能直接幫助,但是長期堅持會對思考很有幫助。
第四,團隊合作
從上面的介紹可以看出,信息學奧數的知識面很廣,光靠他自己消化這些東西是非常困難的,這就需要我們盡可能的發揮團隊合作的精神。同組成員之間嫻熟的配合和默契是需要時間的,具體情況因成員構成而異,這裏就不多說了。
五、練習、練習、再練習
知識的積累固然重要,但是信息學畢竟不是看出來的,而是實踐出來的,這是很多前輩最深的體會。只有通過具體題目的分析和實踐,才能真正掌握數學的運用和算法的應用,並在不斷的實踐中增加編程經驗和技巧,提高對時間復雜性的感性認識,優化時間的分配,加強團隊合作。總之,這裏絕對不能紙上談兵。妳必須通過實戰來鍛煉自己。
大家壹定要問,從哪裏可以發現問題,如何檢查程序是否正確?這個不用擔心。現在有很多在線解題網站,提供了大量的題庫,支持在線閱卷。妳只需要提交程序源代碼,馬上就能知道妳的程序是否正確,運行的時間和消耗的內存。下面我給妳推薦幾個網站。我不建議妳把這幾個站點的題都做,選壹個就好,因為每個站點的題都有壹定的難度。壹套系統的題庫,可以讓妳知道各種難度,各種類型的題。
1、烏拉爾:
烏拉爾是中國學生對俄羅斯烏拉爾州立大學的簡稱,該校設置了烏拉爾在線問題集,支持在線評判。烏拉爾的很多題目都是算法的,很有趣,深得國內學生的喜愛。據“信息學初學者之家”網站統計,烏拉爾的題目類型大致分布如下:
考試問題的類型
搜索
動態規劃
貪婪
結構
圖論
計算幾何
純數學問題
數據結構
其他的
的比例
大約10%
大約15%
大約5%
大約5%
大約10%
大約5%
大約20%
大約5%
大約25%
這和實際比賽中的題量分布大致相同。感興趣的朋友可以去看看。
2、UVA:
UVA代表西班牙的瓦拉杜利德足球俱樂部大學。其中壹所大學建立了帶在線評判的習題集檔案,支持在線評判,類似烏拉爾大學的題庫。但與烏拉爾不同,UVA的題目很多且復雜,有些題目的測試數據比較棘手。這就讓剛到那裏做題的朋友經常無所適從,或者很難找到合適的題目,或者錯了很多次還是不知道錯在哪裏。如果烏拉爾題目主要是為了訓練算法,那麽UVA題目可以訓練全方位的基本功和壹些必要的編程素質。UVA和很多世界知名大學聯合舉辦同步線上比賽,所以那裏有無數的強者,但是妳首先要讓自己明白他們在說什麽:)
3、ZOJ:
ZOJ是浙江大學建立的在線法官,是中國大學建立的第壹個類似網站,也是最好最受歡迎的壹個。筆者和很多同學都在這裏實習。雖然ZOJ也定位為英文網站,但是這裏有很多中國留學生,讓人感覺很友好。目前這裏有500多個題目,難度適中,用索引覆蓋了各大洲的題目類型。另外,ZOJ的JUDGE系統是幾個表現不錯的網站之壹,很少出現回答錯誤和演示錯誤的混淆。這裏每月還有壹次線上比賽,所有註冊用戶都可以參加。
說起國內的在線評委,去年才開始參加ACM比賽的北大,現在已經建立了自己的投稿系統。我們學校去年也開始參加比賽,現在有可能推出自己的投稿系統。如果可以做到,那麽大家都可以去it做題。類似網站的快速發展表明越來越多的學生對探索信息學領域感興趣,這是壹件好事,也意味著更激烈的競爭。
看看這篇文章能為妳做些什麽!我也是ACM的初學者!