1. 程式人生 > >歷年NOIP真題總結

歷年NOIP真題總結

概率 想想 mem 循環 b- 精度 匹配 你在 公園

前言:最近把歷年的NOIP真題肝了一遍(還有3個紫題先咕掉了),主要是到1998年的提高組的題。把題目的做題簡要思路擱在這兒,一個是為了考前翻一翻,想想自己的哪些思路要梳理的什麽什麽的,反正怎麽說呢,就是一個備忘吧。目前整理到2013年了,再往前面的一些題思路不是很清晰(題意就tm不清晰怪我嘍),見諒。

咕咕掉的題:NOIP2017寶藏,NOIP2017列隊,NOIP2016寶藏。
咕咕的原因:心理陰影。(笑)

NOIP2017

小凱的疑惑

a*b-a-b,寫過題解的題,註意浪浪

時間復雜度

大模擬,先編譯,後計算時間復雜度

編譯先查F、E匹配,後插變量名重復

計算時候判斷是不循環的,常數和n到n的,常數到n的

註意局部數組要先memset後使用,(我考場上AC了,洛谷上一直是WA一個點發現局部數組沒有memset)

三種處理方式

逛公園

先從終點開始跑一遍dij,求出所有點到終點的距離

然後記憶化搜索search(x,key)代表從x開始跑可以多跑key的方案數

枚舉接下來走哪條邊,通過這個點到終點的距離與這條邊指向的點到終點的距離的差來計算這條邊多走的路程,讓key減去他

標記一下vis[x][key],如果之前走過了這裏就說明存在0環輸出1退出就行

奶酪

並查集或搜索,註意浪浪

寶藏

沒做

列隊

沒做

NOIP2016

玩具謎題

依稀記得是NOIP2017前我做的練手題。。。

模擬就行了,可以用異或處理方向,記得取模時候別弄錯了,多造幾組數據

天天愛跑步

沒做

換教室

概率dp,先floyed一下多源最短路,然後f[i][j][0/1]代表到第i次課用了j次權限,其中第i次課用了沒用權限的,轉移方程寫法特別艱辛,還要註意如果j==0,第三維度的1直接是inf

最後從所有的f[n][i][0/1]中找答案,最小值

邊界是f[1][0][0]=f[1][1][1]=0,別的初始化為inf

組合數問題

求前n行前m列楊輝三角中%k=0的數,直接前綴和就行了

蚯蚓

單調隊列思想,先sort,然後維護三個隊列,原隊列,切開後長度較短蚯蚓隊列,切開後長度較長蚯蚓隊列,將第一個隊列sort後,每次取出最長的切,因為你取出的最長的蚯蚓(在不延長的情況下)會越來越短,所以後兩個隊列也是單調遞減的,每次取出隊列中最長的蚯蚓切成兩段,註意不用吧所有蚯蚓伸長長度,因為你可以通過時間算出當前蚯蚓的長度。然後最後輸出的時候加上時間。

憤怒的小鳥

從我的題解粘過來,所以比較多

狀壓dp。

我們令f[k]表示當前的狀態為k所需要的最小的拋物線數,其中k是壓縮後的狀態,其中k的第i位為1表示第i個小豬被消滅掉了,為0表示沒有消滅掉。初始狀態為f[0]=0,最終狀態為f[(1<<n)-1]

我們枚舉每一對豬來確定合法的拋物線,計算過原點和這兩只豬的拋物線是誰。註意要特判兩點,如果這兩只豬的橫坐標相同(根本就無法算出一個合法的拋物線啊),或者是拋物線的\(a>0\),那麽我們就扔掉。拋物線的計算就是加減消元,註意無解的情況,然後把所有豬帶入拋物線看那些符合

然後我們按照數字大小從小到大枚舉所有狀態,再用所有的拋物線去轟炸這個狀態,假設這個狀態為k,這個拋物線能消滅的豬是st,那麽用這個拋物線消滅之後變成的狀態就是k|st,其中|是按位或運算。dp方程為f[k|st]=min(f[k|st],f[k]+1)

最後f[(1<<n)-1]就是答案

NOIP2015

神奇的幻方

模擬題,註意處理下一個位置的時候各種特判。各種各樣的特判~~~

信息傳遞

基環樹~首先是註意像這種基環樹最好把單鏈遞歸改成循環處理,否則會炸。(想一想gxz的那個)

還有一個坑點是只有一個點沒有被刪除才開始統計環!註意

鬥地主

要有很好的思考能力,註意到除了單順子,雙順子,三順子要搜索以外,如果把這三個扔了,可以直接貪心求出當前牌的數量。所以我們搜索只需要搜索當前單雙三順子,其它貪心即可。

註意枚舉順子的時候的一些坑點,比如只能到2,另外要逆著思路自己出幾個數據試一下。

跳石頭

很不錯的二分答案題。註意二分答案以後不要寫遞歸了。二分答案容易寫錯的是當前的中點是左偏還是右偏的(可以用長度為2的區間思考一下),還有判斷的時候的各種細節問題。

子串

一個dp題,f[i][j][k][0/1]代表的是當前A串到i,B串到j,匹配了k個字符串,最後一位是否匹配上的方案總數。f[i][j][k][0]=f[i-1][j][k][0]+f[i-1][j][k][1]f[i][j][k][1]=(a[i]==b[j])*(f[i-1][j-1][k][1]+f[i-1][j-1][k-1][0]+f[i-1][j-1][k-1][1])。第一個意思是這個不匹配,上一個可以不匹配或匹配,反正街上。第二個是這個要想匹配必須讓兩個字符相等,如果相等,那麽可以接上上一次匹配的,也可以上一次不匹配這一次匹配,也可以上一次匹配了這一次另起爐竈。邊界條件是所有f[i][0][0][0]=1。最後答案是f[n][m][k][0]+f[n][m][k][1]。這麽做時間復雜度過去了,空間復雜度過不去,因為所有的i和所有的i-1有關我們開滾動數組。

註意取模1e9+7,還有最好要開long long。

這一類區間上的"續命式"的dp題,一般都會加一個大小只有2的維度,用來標記最後一位的狀態,很有用。

NOIP2014

生活大爆炸版石頭剪刀布

開一個表,然後模擬一下就行,很簡單的。沒坑?

聯合權值

由於所有路徑的長度都是1,並且枚舉的是距離為2的點,我們可以枚舉中間點,然後枚舉兩端的點,這樣還是T,我們可以維護前綴和來求所有乘積,每搜索到一條邊,乘上了前面的前綴和之後把這個點的前綴和加進去。因為是有序的數對,最後ans*=2。至於最大值,維護一下前綴最大值然後用當前點乘以前綴最大值更新就行了。

像這種前綴優化、乘法原理的思想經常用到,不能說是固定的算法吧,可以說是一個優化的技巧就能AC了。

飛揚的小鳥

像這種dp思想的題,一些大佬的題解經常會說無後效性和最優化,都是啥意思呢,無後效性就是當前你的轉移和之前的無關,就是不管你怎麽走到這裏,你在這裏幹的事兒都一樣。最優化就是要求一個最優化的原則。

這個怎麽dp呢,令f[i][j]表示當前的坐標為(i,j)走到這裏的最大值。一開始f[0][j]=0。然後從左到右遍歷整個地圖,然後從下到上更新點擊,用完全背包的思想,因為你可以點擊無限次(但是不能不點)。然後從下到上更新不點擊,因為不點擊會下降,所以從下到上更新,這是一個0-1背包。然後把所有柱子設成inf。最後更新答案的時候看看最後一列的最小值,如果沒有最小值就從右往左掃描地圖,找第一個不是inf的位置,往前掃描柱子的個數。

無線網絡發射器選址

註意到如果枚舉地圖會TLE,而點數很少,所以枚舉點。

尋找道路

從終點逆著dfs整個圖,找出所有能夠與終點聯通的點,枚舉不能與終點聯通的點,把指向他的所有點標記為false。然後因為所有邊長度為1,從起點在所有合法的點上跑bfs就行了。

解方程

因為n比較小,m也不太大,所以枚舉所有[1,m]內的數,利用秦九韶算法在O(n)算出表達式的值,因為ai很大,而我們不想使用高精度,所以我們可以模一個質數。不知道為什麽模合數會出鍋。。。模雷哥,模NTT,模江主席都可以

NOIP2013

轉圈遊戲

推理很重要。如下

0號走1輪到m號,那麽0號走B輪到(m*B)%n0號走10^k輪到(m*10^k)%n,優化後(m%n*(10^k)%n)%n所以x號走10^k輪優化後得到((m%n*(10^k)%n)%n+x)%n

未完待續...

歷年NOIP真題總結