1. 程式人生 > >NOIP考綱總結+NOIP考前經驗談

NOIP考綱總結+NOIP考前經驗談

提前 測試 pau 也會 過去 分支 保險 ++ urn

NOIP考綱總結+NOIP考前經驗談

首先來一張圖,很直觀(截止到2012年數據)

技術分享

下面是收集的一些,我改了一下

紅色加粗表示特別重要,必須掌握
綠色加粗表示最好掌握,可能性不是很大,但是某些可以提高程序效率

高精度
  a.加法
  b.減法
  c.乘法(應該只會有高精乘單精)
  d.高精度除單精 (後面c,d考的可能性較小,應該只考a,b)


排序算法
  a.選擇排序
  b.插入排序
  c.hash排序
  d.歸並排序(單純的排序可能用不到,有快排就行了,但是歸並排序的思想很重要)
  e.堆排序
  f.快排

字符串匹配算法
  a.蠻力法
  b.KMP

數論
  a.歐幾裏德算法(用輾轉相除法求最大公約數)
  b.擴展歐幾裏德算法 ax+by=c 的正整數
  c.素數 O(sqrt(n))
  d.篩法求素數
  e.快速乘方(位運算+同余+高精)

樹論
  a.二叉搜索樹
  b.優先隊列(C++中priority_queue,相當於手動維護的小(大)根堆的數據結構優化)
  c.線段樹 (RMQ問題建議使用st算法)
  d.平衡樹一種(建議學習SBT)

圖論
  a.拓撲排序
  b.割頂,割邊(橋) {O(n)}
  c.強連通分支 O(n)
  d.有向無回路圖的最長路徑
  e.歐拉回路
  f.最小生成樹
    ① Prime O(N2

)
    ② Kruskal O(M2)
  g.次小生成樹 {簡單的刪除最大邊是不對的}
  h.最短路徑
    ① Dijkstra
    ② Bellman-ford
    ③ spfa
    ④ flyod
    單源點最短路徑算法推薦使用spfa(即使你習慣dijkstra),Dijkstra不能有負邊不能有回路,所以用spfa更保險

計算幾何
  a.判斷兩條線段是否相交
  b.凸包算法 O(n)

其他算法
  a.並查集
  b.RMQ
  ......

COGSNOIP臨考經驗

1. 提前15分鐘入場,此時靜坐調整心態,適當的深呼吸

2. 打開編輯器並調整為自己喜歡的界面

3. 熟悉文件目錄,寫好準確無誤的代碼模板

4. 壓縮包或許還不能解壓,但是文件名已經可以知道了,在選手目錄下用代碼模板建好所有文件,包 括.c/cpp/pas、.in、.out

5. 開始比賽,不要急於看題目,將試題第一頁的時間、內存限制等等一字不落地看完

6. 看題目時不能走神,看完題目後將其歸入某幾個框架中,包括:模擬/枚舉/搜索/貪心/動態規劃/圖論/分治

7. 根據輸入數據的範圍大致確定算法復雜度,以下均是可能情況,不絕對:

20:2^20=一百萬,O(2^n),搜索

100:100^3=一百萬,O(n^3),Flody/APSP/搜索

1000:1000^2=一百萬,O(n^2),動態規劃/圖論

500000:O(nlog(2,n)),二分答案/二分查找/快排/歸並

1000000:O(n)或O(1),數學問題/改變思維方向/貪心

8. 寫下代碼前,必須保證有充足的思考時間,有成熟的想法後再動手

9. 寫代碼前,盡量用多而強的數據去測試想到的算法,畢竟代碼寫完後再測試就浪費很多時間了

10. 不能想一點寫一點,就算是輸入部分也要在整體思路理清後再寫

11. 永遠別去寫從未接觸過的算法/數據結構

12. 有多余時間一定要進行對拍,即3個程序:生成數據、樸素算法、準備交的算法

13. 交之前5分鐘千萬不要再改動代碼,主要留意代碼中是否還有測試程序時留下的痕跡

14. 走出考場後,除非已經是Day2,永遠別對答案

考前準備秘訣


<>程序習慣註意

一、Linux與Windows的區別
a) 大小寫敏感
i. 在Windows下,文件名大小寫不敏感,例如A.PAS 與 a.pas 與 A.pas 與 a.PaS沒有區別。
ii. Linux視文件名為二進制數據,所以區分大小寫。
iii. 考試時一定要看清題目上要求,區別大小寫。
b) 關閉文件
i. Windows在程序退出時默認自動關閉已打開的文件,會把緩存中數據寫入硬盤。
ii. 在Linux下必須由程序關閉文件,否則沒有被寫入硬盤。
c) 回車符與換行符
i. 在Windows下,兩行文本間有回車符 (ASCII 13) 和 換行符 (ASCII 10)。
ii. 而在Linux下,只有換行符 (ASCII 10)。
d) Read 與 Readln
i. 由於回車與換行在Windows和 Linux下存在有區別,編程時要格外註意。
ii. 尤其讀字符串時,盡量采用Readln,而不要 While not eof read或While not eofln read。
e) 多余字符過濾
i. Arbiter評測系統有多個插件,分為整數比較(過濾無效字符)和逐字節比較。
ii. 由於評測插件的原因,註意輸出結果時,盡量不要有多余空格或換行。
iii. 對於一個整數,使用write輸出。
iv. 對於多個整數,輸出最後一個時不要有多余空格或換行。

v. 對於一個字符串,盡量使用write整體輸出。

二、保存文件
a) 註意文件名,保存要求,目錄結構等問題。
b) 某些省份(如 河南)要求同時提交.exe文件,註意不要漏交。

<>考前十點提醒

一、一定要想好了算法,思路清晰了再編。分析問題時遇到一些即興問起的情況,馬上要深入下去,看已有的算法思路是否有問題。經驗證明,這種即興提起的問題往往是決定算法正誤的關鍵問題。這是一種本能的質疑,本能的差錯,一定不要想:我一會再來看這個問題。一定要立即想清楚,看算法怎麽樣處理才能解決這樣一個問題。確認算法沒有什麽錯誤了再編。如果思路沒清晰,算法不對,編到一半時才發現錯了,這種情況沒有考慮到,浪費了很多時間,或者編完了都還不知道算法是錯的,最後由於樣例特殊,過了樣例,以為對了,但實際上只得10分,或者根本不得分。
二、對於簡單的題,一定要考慮全面,不是編好了程序再來考慮全面,而是想算法的時候就要考慮全面。不要知道個大概就開始寫,後來發現一些特殊數據要作特殊處理,又把程序改過去改過來,改得面目全非,最後老是改不對,不但影響心情,而且還是錯的。
三、看題要靈活,不要絆死在一道題,不要怕。NOIP的題不想就做出來,怎麽可能,肯定是需要想的。但是最好先寫好寫的題,不一定是前兩道題。其實很多時候你是有能力做起的,只是你一看就怕了,也沒有去認真想,隨便敷衍想了一點特殊情況的算法,認為可以騙到分。但經驗證明最後基本是沒有分,即使有,最多不過10。時間是3個小時,要積極一點,經驗證明,很多題想到一定時候便想出來了。並且很簡單。
四、一定要認真讀題,讀的時候積極思考,看看這某句話到底是個什麽意思,要會轉換。特別是對於有時間的問題,到底把時間看成一個點,還是一個區間,具體題目具體分析,一定要符合題意。題沒讀懂就開始做,100%是錯的。題錯,思路也就錯,時間浪費了, 數據還是1個都不過。
五、思考算法的時候,一定要考慮到特殊數據,或一些特殊情況。想好算法,寫下各個變量的意義,明確使用的時候都是遵照這些意義的。寫下關鍵的句子,分清各種情況,這個階段最重要,一定要仔細,不要急著編程。寫完了,還要再看各變量是否帶對,是否有筆誤。等到這些做完了,重復看下整個算法實現過程,等自己解題思路清晰的時候,才開始編程。
六、理清了思路再編程,寫好了關鍵句子再編程,弄清楚了變量再編程,速度會很快,而且正確率也很高。
七、一定要先思考清楚。很多人就是犯不思考就編程這個錯誤,最後自己就昏了。於是浪費大量時間,而且題也做不出來。一定要避免這種情況。這樣就能勝於別人。
八、程序按照思路編完之後,查編譯錯誤。經驗證明,剛剛完成的程序不出編譯錯誤的幾率基本為0。編譯全部修正後,千萬不要測樣例。經驗證明,第一次就把樣例過了的幾率很低,即使過了,在測自己的特殊數據的時候也會出錯。所以,編譯完後一定要靜態查錯。經驗表明,靜態查錯是很有效果的。基本上每次靜態查錯都可以找到變量代錯的錯誤。特別是快排的I,J是否帶錯,DEC,INC是否搞錯,SWAP是不是加了VAR等等。試想:如果沒有靜態查錯,就去測樣例,如果程序有錯,樣例不過,影響心情;即使樣例過了,因為程序有錯,特殊數據也不一定能過;即使特殊數據也過了,程序有錯,評測的時候絕對會錯。發現錯了,影響心情了,還是要來靜態查,心情不好,肯定效率低。那還不如一開始就靜態查,即使發現錯誤,獲得成就感,心情很好。千萬不要慌著去測。要保證程序無錯,思路清晰,結構清晰了,然後再去測樣例,再去測特殊數據。樣例過了不要得意,特殊數據過了不要得意,很有可能還有很多特殊情況你沒有想到。
九、做好心理準備,也許做了兩道自己認為會全對的,還做了一道自己認為能過幾組的。可能只得50。這也是有過的事情。除了做好那幾個步驟,沒有其他的辦法。認了吧。搬塊石頭砸天,也是沒有用的。
十、樹立正確的成敗觀。體驗第一,拿獎第二。往往能從失敗中學到更多的東西,得到更多的感悟。成功固然好,失敗也不錯。成事在天。做到了自己做到的,就是另一種意義上的成功。

<>考前時間利用

一、考前幾分鐘時間,往往能決定成敗,所以一定要做好心態調整。不要去想結果,只看過程,努力了就一定不會白費。
二、在別人緊張、坐立不安的時候,你不妨把時間利用起來。依照慣例,考試前幾分鐘是可以先調試電腦的,所以這時候一定要做些準備:
a) 設置IDE
i. 默認路徑
ii. 窗口大小
iii. TAB寬度
iv. 重啟IDE
b) 準備文件
i. 創建.in .out
ii. 創建模板
iii. 熟悉計算機,檢查有誤故障
c) 休息,等待開考

NOIP前必須記住的30句話

1.比賽前一天晚上請準備好你的各種證件,事先查好去往考場的路線
2.比賽之前請先調整你的屏幕分辨率到你喜歡的大小
3.比賽之前請把編譯器的字體調為你平時慣用的字體,尤其是註意這種字體中的逗號,點,1,l這種易混淆的字是不是區分明顯
4.在不影響視野的情況下,請將字號盡可能調大,方便查錯
5.請將題目通讀完以後,再開始深入思考你認為最容易的一道題
6.即使這道題再容易,也不要著急寫代碼,請先明確自己每一步要幹什麽後,再開始寫,輕敵會是你最大的錯誤
7.即使這道題看起來再沒法做,也不要提早放棄,這個時候紙和筆會是你最好的朋友,自己嘗試幾個例子,也許你就會找到答案
8.請一定先明確自己要幹什麽之後再寫程序,不要走一步想一步
9.如果這是一道動態規劃題,請先把轉移方程寫在紙上再編程
10.涉及到邊界處理、加一減一之類的問題,請在紙上舉個例子,標上下標以後,在編程時參照紙上的下標寫
11.如果思考30分鐘仍一頭霧水,沒有可以實現的算法,請你果斷屏蔽掉100%的那一欄數據,開始寫60%,50%乃至30%的算法——在NOIP裏面,30分絕不是小數目
12.幾個常用的復雜度參考:100以下——可能是搜索;100~500——N^3,1000~5000——N^2,100000~500000——NlogN,500000以上——N或1
13.如果你發現你旁邊的人寫得很快,請你放心,他的算法十有八九是錯的
14.雖然1s+128MB內存 (這是以前的了,現在應該是 1s + 256MB) 是標準配置,不過也不是每道題都是這樣的,還是請認真閱讀試卷首頁的試題說明
15.計算內存的方法:數組大小*類型長度/1000 / 1000=所占內存MB數,int(Pascal:longint)類型長度是4, long long (Pascal: int64) =8
16.記不住的話,記住int (Pascal: longint) 型數組在128MB內存下最大開到2500 0000是比較保險的(占100MB內存)
17.寫完程序之後,請一定不要忙著編譯,請一定要將你的代碼從頭到尾通讀一遍,也就是靜態查錯,這是整個編程過程中最重要的步驟,有的變量重復調用問題調試的話,一個小時也看不出來,靜態查錯可以一下指出錯誤
18.靜態查錯請註意以下方面:
(1)是否寫上了using namespace std? (這是C++的,Pascal就不用了)
(2)數組開得是否夠大?
(3)變量類型是否正確?
(4)memset時,所填的sizeof(XX)的XX是不是匹配?大小是不是正確? (Pascal 是 fillchar)
(5)外層循環與內層循環的i,j是不是混用了?
(6)循環之前,i,j是否定義了?
(7)輸入數據都輸入了嗎?
(8)這個程序是在執行你想讓它執行的步驟嗎?
19.通過樣例後,請你一定不要放松警惕,因為樣例並不能覆蓋所有的情況,請自己設計幾組數據,爭取卡死你的程序
20.如果出現問題,請你調試你的程序,請一定要分模塊調試,不要從頭跟到尾
21.如果你已經設計不出能卡住你的程序的數據,恭喜你可以做下一題了
22.如果你用的是windows,請你註意把system(“pause”)註釋掉 ( 針對C/C++,Pascal 不存在 )
23.為了萬無一失,請你用return 0結束你的程序 ( 同樣 , 針對 C/C++ ,建議是必須加上 )
24.在內存允許的情況下,能開普通隊列就不要用循環隊列,能開下普通數組就不要用滾動數組
25.在時間允許的情況下,能暴力就暴力,高精度能不壓位就不壓位,優化不需要的就不要
26.總之,在不超限制的前提下,能不優化就不優化,以減少代碼量和出錯概率為第一原則
27.當比賽還剩下5~15分鐘的時候,請不要再改動你的程序,即使你懷疑它對你的一個輸入給出了錯誤答案,因為你自己算出的結果也有可能是錯的
28.這個時候請你檢查是否註釋掉了該註釋掉的東西,文件名是否寫對,文件夾是否建對,請一定反復檢查
29.今年賽制更改,沒有人知道究竟會變成什麽樣,所以,與其瞻前顧後,不如集中精力做出你眼前的題目來的實際
30.請記住,NOIP不怕暴力,怕瞎算,不怕不會,怕不敢,有時間的話一定要寫一個暴力程序去對拍,驗證算法的正確性

NOIP考綱總結+NOIP考前經驗談