2019 07 08 NOIP提高組 模擬 A 組

2021-09-25 02:31:32 字數 1799 閱讀 7918

t1:這題不難,但要發現一些性質。

首先我們設f[i]表示n=i時的答案,那麼不難推出可以由f[i-i%p[j]]轉移到f[i],但是這個轉移的複雜度是o(nm)的,需要優化。

我們考慮倒推:既然n能推到n-n%p[i],那麼我們也可以用k推到k+r(注意要滿足p[i]|k且1<=r<=p[i])。

進而我們可以發現:設p0為整除k的且在給出範圍中的最大素數,那麼k能推到的範圍就是k+1~k+p0-1,即可以用f[k]去更新f[k+1~k+p0-1]。

由此我們就可以證明f的單調不遞減性。因為如果乙個f[j]能更新f[i+1],那麼f[j]必能更新f[i],所以f[i]<=f[i+1],得證。

再進一步,我們發現f是乙個分段函式,且相鄰段之間的差為1。這也就是說f從1開始肯定是一段1、一段2、一段3……

既然這樣,那麼我們考慮用當前段的端點l、r來求出下一段的端點l1、r1。首先顯然l1=r+1,而r1=max(i+p0-1),(l<=i<=r),即r1為l~r能更新到的最遠點。

但是我們如果直接列舉i進行質因數分解的話會超時,所以我們可以列舉給出的素數,然後通過計算出l~r中最大的素數的倍數來求r1。

t2:正解很簡單,但是很巧妙。

首先從左上角開始bfs,求出與左上角顏色相同的聯通塊,然後把聯通塊反色,在做一邊。每次bfs時ans加1,一直bfs到所有有顏色的點都被遍歷到為止。

證明很好想,這裡就不多講了。

總結:這一題主要運用到倒推的思想(包括第一題也是)。以後遇到這種十分棘手題可以多考慮一下如何從最後的狀態往前推。

t3:神奇的線頭dp。

我們先轉化一下題目:既然每乙個e都要話2的代價去刪除它,那麼我們不妨把e全從原序列中去除,然後把每乙個e後面的點設為必經點。而線頭dp就是說在乙個數軸中要連線使路徑進過一些必經點(太難表達了)。

對於這一道題,設f[i][j]表示第i個點前有一條線直接從它的前面連到後面乙個字母為j的位置去的最小代價。

g[i][j]表示第i個點前面有一條直線連到i的後面乙個字母為j的位置去,然後從那個位置走到i前面某乙個,再從那個「某乙個位置」連到乙個i後面的字母為k的位置上去的最小代價。

轉移時我們要注意分類討論j是否等於a[i]的情況,並且在求f[i][j]是如果i是必經點的話就不能直接把i給跳了。

至於初始值,就是f[0][a[1]]=0。而答案就是f[n][c]=1,c為乙個不存在的字母(可設為11).這樣求答案的意思是最後把線連向某個處於最後位置的不存在的字母,這樣做是為了方便求答案。最終ans=f[n][c]+se*2-2。se*2表示的是「每乙個e都要話2的代價去刪除它」,-2為的是減去連向不存在的字母的代價。

詳細解釋看

最後貼一下****移方程有10條,十分複雜):

#include#include#include#include#define maxn 70010

#define maxv 12

using namespace std;

int a[maxn],bz[maxn],f[maxn][maxv],g[maxn][maxv][maxv],n,se;

char a1[maxn];

int main()

se=n-s;n=s;

n++;a[n]=11;bz[n]=bz[n-1];

memset(f,0x7f,sizeof(f));

memset(g,0x7f,sizeof(g));

f[0][a[1]]=0;

for(i=1;i<=n;i++)

for(j=1;j<=11;j++) }

printf("%d",f[n-1][11]+se*2-2);

}

NOIP提高組 矩陣

在麥克雷的面前出現了乙個有n m個格仔的矩陣,每個格仔用 或 表示,表示這個格仔可以放東西,則表示這個格仔不能放東西。現在他拿著一條1 2大小的木棒,好奇的他想知道對於一些子矩陣,有多少種放木棒的方案。因為棍子是1 2的,所以很容易就能發現,兩個被分割的塊,除了跨越兩個塊擺放木棍的方案數會對答案有影...

NOIP提高組2005 過河

過河 river 問題描述 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的...

NOIP提高組 20151029模擬

其實這套題目並不算太難,但是還是發揮不了100 水平。第一題直接線性篩法,求出質數,然後就可以判斷乙個數是否為質數了。這道題還可以用miller rabin去求,後者的速度較快,如果資料再大些,就要使用後者了。第二題,比賽時發現了,當n 7時,答案會每四個一迴圈,但是就沒有繼續往下想,其實想下去會想...