考試前把讀入優化和庫以及對拍文件打好作好準備工做,另外注意放鬆心態,太緊張了確定考很差··將本身的注意力集中起來算法
考試的基本策略是對每於道題先想個20分鐘,若是想不出個靠譜的方法就把趕忙暴力打了必定要打暴力,想不出正解要打暴力,想出了正解對拍也要打暴力,並且把暴力打了以後內心都踏實得多··起碼保底了,打完後再想正解.數組
先要肯定大致方向:模擬(每每只有第一題),策略(貪心等),數學,數據結構,圖論,dp,字符串,樹,二分,三分,搜索,(多半會加上剪枝折半記搜或者迭代加深)數據結構
合理利用並查集,哈希,倍增,差分,鏈表,優先隊列,dfs序,桶,單調隊列,單調棧等輔助算法編輯器
充分利用題目給的數據範圍考慮可能用到的算法,畢竟n^2,nlogn,nlogn^2,n仍是比較好判斷的優化
不要一看到數據結構就往線段樹上面想,可能會沒有那麼'麻煩'spa
dp的時候多想一想平時本身用到的套路,如最大子串和,最長不降低序列,最長公共子序列,各類揹包問題,樹形dp考慮求樹的直徑,重兒子,最大次大值等,區間dp的枚舉斷點,另外複雜度若是不對要考慮dp優化(滾動數組或者決策單調性),有時也會用數據結構優化dp調試
圖論的話通常在比較簡單的狀況下只會考最短路和最小(大)生成樹,和拓撲排序,tarjan求強連通份量邊雙連通割點,但圖論題比較難的一點是經過條件間的邏輯關係轉化成圖論題,這時除了上述算法之外經常會用匈牙利差分約束等算法解決排序
字符串自己算法不多,只有kmp,哈希,trie,ac自動機,manecher,所以有時它會和其餘算法一塊兒考,如dp;隊列
想題的時候思惟要靈活點··若是往一個方向想一直沒進展的話就要考慮放棄了字符串
有時候想不出正解時可能暴力就是正確的,本身在計算複雜度時可能考慮了許多多餘的狀況(因此要必定打暴力啊)
鑑於在NOIP考場上它算法可能不會考多難··但確定會用思惟難度來彌補,若是能夠適當地用NOI的一些算法來下降思惟難度的話能夠考慮考慮
經常使用套路:
倒插點/邊,乘法轉對數,xor的高低位貪心,平均數轉最長和大於0,加邊權求特定集合最小生成樹,拆點,枚舉邊計算貢獻,
打代碼時必定要集中精神,否則很容易出錯··若是打完代碼後仍是調試半天找出不少錯誤說明打代碼時確定沒認真···
打代碼前要想一想這道題是否有什麼邊界條件尚未考慮.分類討論是否全面,有時由於一個邊界條件可能就錯完了,打代碼時也要好好考慮,好比mod的時候若是是負數要加起來,用到除法的時候除數是否考慮了0,是否須要判斷無解狀況,有沒有可能訪問了非法的位置(爆數組或者訪問了負的位置,用桶的時候尤爲注意),有沒有可能爆int,有沒有可能double寫成了整數型
注意本身的算法是否爆空間,用cout<<sizeof()/1024/1024判斷判斷
若是擔憂爆int就開long long,不要偷懶!!
用mod的時候注意mod透沒有
INF用0x3f3f3f3f很優秀!
儘可能保證本身代碼的簡潔度,能不分類討論就不要分類討論(固然是在保證正確性的狀況下),有時若是要判斷某些邊界狀況很麻煩的話能夠在邊界加上不影響答案的元素,好比在splay的題中咱們經常在裏面放一個-inf和一個inf··平時就要多參考其餘人寫的比較優美簡潔的代碼··否則調試的時候可能會暈
注意多組數據下的清0操做
合理使用stl中的文件,如vector,queue(queue,deque,priority_queue),set,map(這玩意兒有點不靠譜··能手打hash表仍是手打吧)
若是變量不少的話變量名就打長一點,好辨別···實在不行打拼音··
打代碼時注意本身是否用到了非法的變量名,像y1,x1,next,index,hash啥的必定要注意··若是平時用這些變量名用習慣了的話能夠在第一行打一個」改變量名「,這樣的話編譯的時候能提醒本身
打完後能夠加個register提升代碼速度,(有可能會re,加完後運行程序看一看)
不要讀入剪枝!!!
看看是否用到了O2優化,用了的話用本身編輯器開O2跑一跑程序
考完後重點再次檢查上述的錯誤,數組開小沒?是否須要開int?是否須要開double?是否須要改變量名?是否須要考慮邊界?
最後好好檢查文件輸出輸入,錯了就完了··