首先來一張圖,很直觀(截止到2012年數據)算法
下面是收集的一些,我改了一下編程
紅色加粗表示特別重要,必須掌握
綠色加粗表示最好掌握,可能性不是很大,可是某些能夠提升程序效率
windows
高精度
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更保險post
計算幾何
a.判斷兩條線段是否相交
b.凸包算法 O(n)學習
其餘算法
a.並查集
b.RMQ
......
【COGS】NOIP臨考經驗
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,永遠別對答案
<一>程序習慣注意
1、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總體輸出。
2、保存文件
a) 注意文件名,保存要求,目錄結構等問題。
b) 某些省份(如 河南)要求同時提交.exe文件,注意不要漏交。
<二>考前十點提醒
1、必定要想好了算法,思路清晰了再編。分析問題時遇到一些即興問起的狀況,立刻要深刻下去,看已有的算法思路是否有問題。經驗證實,這種即興提起的問題每每是決定算法正誤的關鍵問題。這是一種本能的質疑,本能的差錯,必定不要想:我一會再來看這個問題。必定要當即想清楚,看算法怎麼樣處理才能解決這樣一個問題。確認算法沒有什麼錯誤了再編。若是思路沒清晰,算法不對,編到一半時才發現錯了,這種狀況沒有考慮到,浪費了不少時間,或者編完了都還不知道算法是錯的,最後因爲樣例特殊,過了樣例,覺得對了,但實際上只得10分,或者根本不得分。
2、對於簡單的題,必定要考慮全面,不是編好了程序再來考慮全面,而是想算法的時候就要考慮全面。不要知道個大概就開始寫,後來發現一些特殊數據要做特殊處理,又把程序改過去改過來,改得面目全非,最後總是改不對,不但影響心情,並且仍是錯的。
3、看題要靈活,不要絆死在一道題,不要怕。NOIP的題不想就作出來,怎麼可能,確定是須要想的。可是最好先寫好寫的題,不必定是前兩道題。其實不少時候你是有能力作起的,只是你一看就怕了,也沒有去認真想,隨便敷衍想了一點特殊狀況的算法,認爲能夠騙到分。但經驗證實最後基本是沒有分,即便有,最多不過10。時間是3個小時,要積極一點,經驗證實,不少題想到必定時候便想出來了。而且很簡單。
4、必定要認真讀題,讀的時候積極思考,看看這某句話究竟是個什麼意思,要會轉換。特別是對於有時間的問題,到底把時間當作一個點,仍是一個區間,具體題目具體分析,必定要符合題意。題沒讀懂就開始作,100%是錯的。題錯,思路也就錯,時間浪費了, 數據仍是1個都不過。
5、思考算法的時候,必定要考慮到特殊數據,或一些特殊狀況。想好算法,寫下各個變量的意義,明確使用的時候都是遵守這些意義的。寫下關鍵的句子,分清各類狀況,這個階段最重要,必定要仔細,不要急着編程。寫完了,還要再看各變量是否帶對,是否有筆誤。等到這些作完了,重複看下整個算法實現過程,等本身解題思路清晰的時候,纔開始編程。
6、理清了思路再編程,寫好了關鍵句子再編程,弄清楚了變量再編程,速度會很快,並且正確率也很高。
7、必定要先思考清楚。不少人就是犯不思考就編程這個錯誤,最後本身就昏了。因而浪費大量時間,並且題也作不出來。必定要避免這種狀況。這樣就能勝於別人。
8、程序按照思路編完以後,查編譯錯誤。經驗證實,剛剛完成的程序不出編譯錯誤的概率基本爲0。編譯所有修正後,千萬不要測樣例。經驗證實,第一次就把樣例過了的概率很低,即便過了,在測本身的特殊數據的時候也會出錯。因此,編譯完後必定要靜態查錯。經驗代表,靜態查錯是頗有效果的。基本上每次靜態查錯均可以找到變量代錯的錯誤。特別是快排的I,J是否帶錯,DEC,INC是否搞錯,SWAP是否是加了VAR等等。試想:若是沒有靜態查錯,就去測樣例,若是程序有錯,樣例不過,影響心情;即便樣例過了,由於程序有錯,特殊數據也不必定能過;即便特殊數據也過了,程序有錯,評測的時候絕對會錯。發現錯了,影響心情了,仍是要來靜態查,心情很差,確定效率低。那還不如一開始就靜態查,即便發現錯誤,得到成就感,心情很好。千萬不要慌着去測。要保證程序無錯,思路清晰,結構清晰了,而後再去測樣例,再去測特殊數據。樣例過了不要得意,特殊數據過了不要得意,頗有可能還有不少特殊狀況你沒有想到。
9、作好心理準備,也許作了兩道本身認爲會全對的,還作了一道本身認爲能過幾組的。可能只得50。這也是有過的事情。除了作好那幾個步驟,沒有其餘的辦法。認了吧。搬塊石頭砸天,也是沒有用的。
10、樹立正確的成敗觀。體驗第一,拿獎第二。每每能從失敗中學到更多的東西,獲得更多的感悟。成功當然好,失敗也不錯。成事在天。作到了本身作到的,就是另外一種意義上的成功。
<三>考前時間利用
1、考前幾分鐘時間,每每能決定成敗,因此必定要作好心態調整。不要去想結果,只看過程,努力了就必定不會白費。
2、在別人緊張、坐立不安的時候,你不妨把時間利用起來。依照慣例,考試前幾分鐘是能夠先調試電腦的,因此這時候必定要作些準備:
a) 設置IDE
i. 默認路徑
ii. 窗口大小
iii. TAB寬度
iv. 重啓IDE
b) 準備文件
i. 建立.in .out
ii. 建立模板
iii. 熟悉計算機,檢查有誤故障
c) 休息,等待開考
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不怕暴力,怕瞎算,不怕不會,怕不敢,有時間的話必定要寫一個暴力程序去對拍,驗證算法的正確性
來自http://blog.csdn.net/farmerjohnofzs/article/details/52651327?_t_t_t=0.43482167025676866