- 程序設計競賽專題挑戰教程
- 藍橋杯大賽組委會組編
- 2167字
- 2023-03-10 16:52:58
如何高效備賽
剛接觸藍橋杯軟件類大賽的參賽者往往有這樣的困惑:大賽似乎很難、很花時間,不僅難以入門,而且學習成本很高,往往需要半年以上,甚至一年、兩年的勤奮學習,才能獲得較好的成績。
本書正是為了解除這樣的困惑而編寫的:通過本書的學習,你能從一名算法競賽的“小白”,開始成長為熟悉算法知識、構建起算法思維、擁有高效編碼能力的計算機編程人才。
好學上進的你肯定有這樣的期望:我想得獎,盡快得獎!
這本書是得獎的捷徑嗎?答案是確定的!然而,“捷徑”往往是“艱難”的代名詞。“捷徑”并不一定意味著省力,正如爬山的捷徑往往更陡峭、更令人費力一樣。在算法競賽的學習這件事上,“捷徑”意味著要付出更大的努力,要進行高強度的學習。本書之所以能成為得獎的“捷徑”,是因為所提供的知識點更為集中、講解更清晰、題目設置更有針對性。是否能走通這個“捷徑”,取決于你愿意付出多少時間和精力。
學習算法競賽,請注意以下幾個重要問題。
1.刷題
在面向算法競賽的所有學習方法中,最重要的一種方法是“刷題”。也就是大量做題,在做題時進行建模訓練和編碼練習。只讀理論、只看書,而不做題,學習效果只會略大于零,能力得不到提高,肯定不能得獎。《天龍八部》里的王語嫣,是位武學理論大師,但手無縛雞之力,打不過一個沒學過任何武功的人。要成為真正的編程高手,只能通過大量做題,才能真正理解算法知識、提高編程能力,并在競賽中發揮出水平。
那么,“刷”多少題合適?本書介紹了算法競賽中處于初級和中級層次的知識點,讀者可每個知識點做10~20題,總共要做600~1000題,多多益善!
初學者問:“啊,要做這么多題嗎?太累了!”
我的回答:“沒其他辦法,這是算法競賽的必由之路。”
2.速度
參加算法競賽,編程速度極為重要。藍橋杯軟件類大賽要求在4小時內完成10道題,時間非常緊張。因而,編程速度是所獲獎項級別的重要影響因素。
如何提高編程速度?讀題要快!對于每道題,都需要建模后才能進行編程。在競賽時能快速讀完題目并思考出合適的算法,是需要經過大量做題訓練的。訓練會提高大腦的興奮度,用最快的速度理解題目并建立計算機編程模型。
此外,為加快做題速度,還需要注意以下3點。
(1)熟練掌握集成編譯環境。
(2)減少調試,最好是寫完程序后,爭取一次能通過測試樣例。為了減少調試,盡量使用不容易出錯的方法,例如少用指針、多使用靜態數組、將邏輯功能模塊化等。注意,不要使用動態調試方法,不要用單步跟蹤、斷點等調試工具。因為這樣會很慢,況且算法競賽的代碼不長,用不著這樣做。如果需要查看中間的運行結果,就在代碼中的關鍵地方打印出調試信息。
(3)使用庫函數。如果題目涉及比較復雜的數據處理,或者像sort()這樣需要靈活排序的函數,用庫函數可以大大地減少編碼量,并減少錯誤的發生。注意積累C++、Java、Python編程語言的庫函數。
3.模板
模板是某些數據結構、算法的標準代碼,可謂計算機科學發展過程中眾多高手提煉出的“精華”。
初學者問:我想速成,來不及做很多題,不過我可以多準備一些模板,競賽的時候套一套模板,是不是也能獲獎?
我的回答:模板有用且需要掌握,但是,在賽場上模板的作用有限。
模板很有用,例如并查集模板、快速冪模板、埃氏篩模板等,需要參賽者牢記并熟練應用。學習經典算法時,往往也需要整理模板并要多次地學習和使用。有必要強調的是,對于模板中的代碼,參賽者得真正理解并多次使用過,才能在做題時快速地應用于編程。
有的算法競賽可以帶紙質資料進場,相當于開卷考試,例如ICPC、CCPC,有不少參賽者帶了打印出來的厚厚一沓代碼資料和各種書籍進場競賽。但是,藍橋杯軟件類大賽采用的是閉卷形式,禁止帶任何資料進場,因而參賽者要完全靠腦力,模板要靠“背”!這就增加了一定的難度。
不過,把模板帶到賽場上用處大嗎?答案是“90%的否定”!換句話說,想靠模板速成、急著用來參賽獲獎是不現實的。
首先,賽場上的題目基本是新題,也就是以前沒有出現過的(按道理是這樣,至于命題人是不是按道理辦事,就是主辦方的責任了)。做題少、對知識點理解不深的初學者難以知道應該套用哪個模板。
其次,不能直接套用模板。不同的編程題目,即使用到相同的算法或數據結構,也往往不能直接使用同樣的代碼,而是要作出很多修改,因為不同環境下的變量和數據規模是不同的。對于模板的學習和使用,需要花時間融會貫通,不能急于求成。參賽者應在深入理解和熟練地掌握模板之后,才能將之應用到競賽解題中。為了避免參賽者直接套用模板,藍橋杯軟件類大賽的命題人甚至會在出題上“繞圈子”。因而不能原封不動地“抄”模板,而是要靈活運用。
初學者看到這里,可能想打退堂鼓了。但是,請記住“成本越高,收益越大”。學習備賽累、提高編碼水平累,這的確是一道門檻,但也正是如此才能篩選出真正的計算機編程能手。如果一個技能很容易掌握,那這個技能大多是大眾化的,含金量不高;而像藍橋杯這樣的競賽,的確是不好學且學習成本高,但能學出來的就是高手,畢業后也能有更光明的就業前景。
有學生是零基礎,是剛開始學編程語言,想等學完之后再開始算法競賽的學習。不要等!因為算法競賽的編碼用不著復雜語法,而且初學者也能將競賽題當成編程語言的練習題來做。
自主學習,最大的動力是自己!也要找同學一起學,不要自己一個人,有難度的學習,需要互相鼓勵,一起進步。
讓我們一起走進算法競賽的“星辰大海”!