前言:2017年5月27日,第八屆藍橋杯個人賽C/C++大學A、B、C組、Java大學A、B、C組共六個小組決賽在北京舉行。對於此次比賽,有過歡樂也有過遺憾,原本沒打算寫賽后總結,但是指導老師要求我們進入決賽的同學各自發一篇賽后總結給他,我想了想,既然要寫,還是好好寫一下。
記得去年是第一次參加藍橋杯,報的組別是C/C++大學B組,那時的自己,幾乎沒有接觸過任何算法,連一個簡單的選擇排序的概念都不知道。報完名后,原本打算寒假在家好好去准備一下,結果由於一些原因,對於算法的學習幾乎沒怎么弄。寒假過后,此時距離第七屆藍橋杯個人賽省賽還有不到一個月的時間,那時我計划着一個星期做五道算法題,准備即將到來的省賽,可是自己當時做題的效率幾乎低的不行,遇到難一點的題目,花費四五個小時都無法解決,參考網上的解答,看的也是半懂不懂的樣子。而且當時,自己還報名參加了互聯網+、計算機設計大賽,剛好都擠在了這個時間段。那時真是讓人頭疼——時間不夠用,算法基礎太差,做訓練題效率低,幾乎沒有什么收獲。就這樣,糊里糊塗的就去參加了第七屆藍橋杯個人賽省賽,結果連一個省賽三等獎都沒有拿到。
鑒於第一次參賽的慘痛經歷,讓我明白了一點:做任何事情務必要專注,要想達到相應的目標,就得付出足夠的時間和精力。
今年是我第二次參加藍橋杯,報的組別是相對簡單一點的Java大學B組,這次參賽應該也是我最后一次參加。去年9月份,我所在專業開了算法這門課程,那時剛好順着課堂把蠻力法、減治法、變治法、分治法、貪心法、動態規划法等基本算法系統學習了一遍,給我的感覺:算法真是一個很神奇的東西,不同的思想,其之間的時間效率和空間效率差別幾乎是不能相提並論。在系統梳理了一遍相關算法的基本知識后,然后我就開始把算法老師布置的課程實驗挨個認認真真的做了一遍,而且事后還感覺做的不夠,還把隔壁班算法老師布置的課程實驗也挨個認認真真的做了一遍。這樣下來,讓我對於一些基本算法思想和模塊有了一個更加清晰的了解和認識。
到了今年1月份,我就正式開始着手准備了今年的藍橋杯比賽。首先,從《算法設計與分析基礎》這本教材開始復習,那時指導老師剛好給我們布置了一個作業:使用埃拉托色尼篩選法求取素數問題、漢諾塔問題、比較選擇排序、冒泡排序、合並排序、快速排序之間的時間效率;然后,我看了一下這三個問題,剛好對應教材上第2章、第3章、第5章的部分內容。因此,我就打算從教材的第一章開始,把每一章提出的經典算法和相關問題都挨個上機實現了一下,書上看不懂的就上網查查相關資料,就這樣當刷完教材上所有問題后,已經到了3月初,期間還刷完了《編程之法面試和算法心得》。在刷書的過程中,我發現書上的思想講解和相關代碼真的是精辟,比網上絕大多數資料文章要講的清楚多了,也讓我心里對於編著出書的作者表示由衷的敬佩啊。
3月初,開始刷藍橋杯練習系統上面的題,由於已經初步掌握了相關算法基礎,對於難題一天也能夠完成兩題左右,較簡單的題一般能夠完成十題左右,甚至更多。對於此次比賽准備收獲較大的是3月8日晚上,觀看了藍橋杯官網邀請去年榮獲C/C++大學B組和Java大學B組特等獎獲獎選手指導老師的講座。當時進行講座的老師系統分析了一下藍橋杯個人賽歷年真題的考點,系統歸納如下:
對於省賽准備,重點攻克以下應用方法:
(1)枚舉
(2)遞推遞歸
(3)動態規划
(4)搜索
(5)回溯
在這五種方法中,重中之重的方法在於搜索和回溯的應用,搜索包括DFS、BFS,更難一點的就是DFS記憶化搜索,至於回溯最好去了解一下八皇后問題,這樣可以對於回溯了解的更加深刻。
對於決賽准備,除卻上面五點外,還要重點系統學習一下圖論相關知識:
(1)DFS、BFS
(2)求割點或橋
(3)極大強連通分量
(4)拓撲排序
(5)最短路徑
(6)歐拉回路
(7)最小生成樹
(8)最大流、費用流
(9)二部圖
此時距離4月8號進行第八屆藍橋杯個人賽省賽剛好還有一個月的時間,那時藍橋杯官網說在3月15日——23日期間進行一次模擬賽,用於熟悉比賽系統和相關題型以及難易度。抱着測試一下自己這段時間學習成果的想法,報名參加了這次模擬賽。在3月1日——21日期間,我一直在刷藍橋杯官網練習系統上的習題,其中大部分習題都是水題,幾乎沒什么難度,大部分考點也是搜索題,做了難一點的題后,后面稍微簡單點的題幾乎不用思考。3月22日,上午8:00-12:00在宿舍參加了這次模擬賽,真的是整整做了四個小時,最后提交答案后,系統立馬給出成績,下載查看后——總成績0分,求我當時的心里陰影。於是那天下午,立馬開始進行題后分析:
(1)看題馬虎,理解題意錯誤,導致耗費大量時間在徘徊審題,甚至感覺題目出的有問題;
(2)題目要求的基本輸入輸出,沒有按要求來,在提交代碼時,竟然忘記刪除測試打印語句,導致原本可以拿滿分的題目,結果拿了0分;
(3)前兩周密集做的訓練題一點含金量都沒有,大部分都是水題,和比賽考題難度幾乎不沾邊。
從這次模擬賽過后,我就決定開始刷歷屆省賽真題,不再做藍橋杯練習系統上的習題,用真題來訓練自己的審題能力以及相關算法的應用能力。就這樣,開始了更加密集的刷題之旅,基本上是兩天刷三套歷屆真題。在省賽前十天,指導老師還布置一些訓練習題,在省賽前,除了完成第四屆到第七屆的省賽真題,還完成了指導老師布置的大部分訓練習題。
4月8日9:00-13:00在湖北第二師范學院進行了本次省賽,省賽共有十題,記得當時自己第二題、第三題、第四題應該是做錯了,其中第四題時一個魔方相關問題,具體解決方法應該是DFS搜索,這題得分率應該是最低的;至於第三題隱藏了一個包袱,就是要進行度量單位轉換,這個應該也是坑了不少同學;第二題是一個使用DFS進行全排列然后去重、去掉不符合要求的問題,這個記得好像是自己沒有去重。對於后面的四道編程大題,第7題有關日期的問題沒有去重,最后一題是使用暴力求解,整體就做成這樣,這四題感覺也都是比較基礎,基本都是枚舉和DFS。當時考完后,感覺做的很一般,應該就是一個省二,哪知道5天后公布成績,得了省一,排名還比較靠前,那時感覺非常開心。對於這次省賽,我個人感覺題型對於DFS搜索和枚舉應用幾乎占用了百分之八十的分數,其中得分點關鍵在於審題和DFS搜索運行次序的理解深度。
4月14日到5月25日期間,正式開始了決賽備戰,首先我把圖論相關知識點系統學習了一遍,印象最深的是並查算法、TarJan算法求取割點、SPFA算法的應用。這些讓我對於算法的魅力又有了一個新的認識,完成圖論的學習之后,繼續完成藍橋杯練習系統中未完成的習題以及指導老師布置的訓練習題,完成這些任務差不多到了5月10日。從5月10日到5月25日期間,正式開始刷歷屆決賽真題,從第二屆到第七屆的真題都刷了一遍,並分析了一下各屆的考點,發現第二屆-第四屆題型及考點變化較大。第五屆-第七屆題型未變,但是題目的難度變化較大,考點也是變化較大。其中考點,讓我感覺難度較大的是:博弈論、幾何題應用(其中有精度要求)。
這次決賽,共六題,兩道結果填空題,一道代碼填空題,三道程序設計大題。讓我感覺略坑的是,它的第五題剛好考了一個博弈論的題目,求我當時的心里陰影。對於博弈論,我在准備過程中就只看過拈游戲類型的問題,其它類型的基本都沒學過,當時和一學長聊天,談到對於博弈論有系統的歸類,如果系統學習后,對於博弈論這類題目還是很簡單的,對於這題當時自己是按照示例結果推博弈思想,幾乎是去碰的,不敢確定答案的正誤,不過對於給出的示例數據都是能夠通過。這次比賽的第一題是一個DFS搜索題,比較簡單;第二題,是要開一個二維數組,來進行數據模擬,當時自己看了題沒有信心在半個小時內做出來,就去做后面的題,到最后只剩下半個小時,再來做這題時,頭腦一片漿糊,就沒寫出來,這也是我和一等獎的差距吧,傷心;第三題是一個打印樹形結構題,考查遞歸調用順序的思想,說白了也是DFS問題。第四題,是一個關於2進制到36進制轉換的問題,這題官方給的題意有一點問題,在考試的過程中,監考老師還特地說明了一下,這題也不難;第六題,考查的是一個1—10000的區間集合求並集的問題,這題雖然也寫了,感覺最多應該只能拿到百分之五十的分數。
28號上午11點,藍橋杯官網公布了此次比賽成績,當時便迫不及待的查看了一下成績,Java大學B組二等獎,然而我的上一位同學剛好是一等獎,看到這樣的結果我表示是有一點開心也是有一點失落。雖然這次比賽與一等獎插肩而過,但是此次比賽的准備過程也讓我收獲頗多。