信息學奧賽(NOIP)複賽學習方法推薦
一、確定你的語言
NOIP包括三種語言c/c++/pascal,在最初必須確定自己使用的語言。沒有c/c++基礎的,個人建議使用pascal,因為它更容易上手,如果有充裕的時間,則建議c/c++,因為它們對你今後的程序編寫,更有益處。
二、從排序入手
排序是基礎中的基礎,快速排序是必備本領,方法就是背下來。c/c++是自帶快排的,因此很輕鬆。多關鍵字排序和穩定排序也是必須掌握的排序知識。
三、貪心和窮舉以及模擬——最簡單的程序
想得獎,必須掌握貪心和窮舉以及模擬,雖然不能讓你得滿分,但可以給你拿到30-60分。它們是你想不出更好演算法時的救命稻草。
貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的局部最優解。但是貪心是可以得分的。
枚舉演算法是指,列舉出所有可能的取值,從中找出最優解。
模擬演算法是指,通過逐步進行操作、逐步判斷來推斷是否符合題目中所給出的情況。非常耗時,一般不可能得到最優解,但是可以得到部分分數。
四、用動態規劃來訓練思維
比較難,對思維的周密程度和邏輯要求非常高。可以用來訓練思維,對於學習時間短的筒子,動態規劃可以幫助你迅速進入編程狀態,也有助於幫你發現題目背後可能隱藏的更簡便的演算法。
動態規劃主要的思考規律應該如下:
定義函數(動態轉移方程中轉移量的定義)——>建立方程——>確定初值和邊界
提醒!考場上想不到動態轉移方程,請選擇貪心、枚舉或模擬等方法來獲得部分分數。動態規劃最後得出的答案不正確時,也不要耗費大量時間來找出錯誤,因為這非常難,也非常耗時間,得不償失。
五、學習簡單的圖論
包括:(單源或多源)最短路和(最小)生成樹。
最短路中需要學習Dijkstra演算法和Floyd演算法。近年來圖論題目越來越難,知識點越來越多,所以時間不夠,請掌握這兩種。
最小生成樹需要掌握Prim演算法和Kruskal演算法。前者適用於稠密圖,後者適用於疏密圖。兩者可以比較學習,看到它們的優點和不足。
六、常用的數據結構——讓程序更快一點
最常用到的是堆(優先隊列)、並查集以及樹狀數組堆。
堆:只關注「直系親屬關係」,不關注「旁系」。常配合貪心使用。
並查集:快速判斷兩個元素是否有關聯,增加其他演算法,還可判斷元素間關係。
樹狀數組堆:平衡查詢和修改的操作複雜度的一種演算法,常用於解決需要查詢和修改的問題。
七、搜索——和枚舉很像
深度優先搜索和廣度優先搜索。
深度優先搜索:一條路走到底。
廣度優先搜索:每一步將下一步的可能性放入隊列中,然後按照隊列順序來探測。
複賽中往往會加入很多複雜的元素,所以也需要好好掌握。
八、最後列一下一定要學習的數學基礎知識
快速冪、高精度、篩法選素數、輾轉相除法
九、必要的刷題
信息學競賽的題庫在網上隨處可見如TYVJ,RQNOJ,洛谷,大視野測評等,為了方便大家尋找到適合自己的題庫,我們會在今後的推送內容中對當今網路上一些題庫進行專業的分析,幫你找到適合自己的題庫。
推薦閱讀: