NOIP提高組2005 路徑壓縮 過河

2021-07-24 08:05:11 字數 1826 閱讀 5463

在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點:0,1,……,l(其中l是橋的長度)。座標為0的點表示橋的起點,座標為l的點表示橋的終點。青蛙從橋的起點開始,不停的向終點方向跳躍。一次跳躍的距離是s到t之間的任意正整數(包括s,t)。當青蛙跳到或跳過座標為l的點時,就算青蛙已經跳出了獨木橋。

題目給出獨木橋的長度l,青蛙跳躍的距離範圍s,t,橋上石子的位置。你的任務是確定青蛙要想過河,最少需要踩到的石子數。

對於30%的資料,l <= 10000;

對於全部的資料,l <= 10^9。

輸入格式

輸入的第一行有乙個正整數l(1 <= l <= 10^9),表示獨木橋的長度。第二行有三個正整數s,t,m,分別表示青蛙一次跳躍的最小距離,最大距離,及橋上石子的個數,其中1 <= s <= t <= 10,1 <= m <= 100。第三行有m個不同的正整數分別表示這m個石子在數軸上的位置(資料保證橋的起點和終點處沒有石子)。所有相鄰的整數之間用乙個空格隔開。

輸出格式

輸出只包括乙個整數,表示青蛙過河最少需要踩到的石子數。

樣例輸入

10 2 3 5

2 3 5 6 7

樣例輸出

2

1s

noip2005 第二題

以前做的這題,今天翻出來重新理解了一下,把以前沒有搞懂的地方搞懂了。

很明顯,這題直接dp的話肯定過不了,畢竟橋實在太長了,直接dp會列舉很多不必要的運算,因此我們可以想到將兩塊石頭之間的距離縮短,將這段距離%d,d代表青蛙肯定可以跳的長度,要盡量小。這個長度可以手推一下:跳躍距離為1-10,我們將單個的,也就是s==t的情況單獨處理,剩下的就來算d。

s=1時,d=1(盡量小);

s=2,t=3+時,d為偶數(用s來跳,因為s最小);

s=3時,d為3的倍數;

s=4時,d為4的倍數;

s=5時,d為5的倍數;

此時d最小為60。

s=6時,d=60;

s=7時,要注意,t肯定》=8,將s和t弄在一起搞,s+s+1=15,d=60依然滿足;

s=8時,60已無法滿足,考慮要滿足上面的,d可以為90,此時t>=9,用t來跳。

s=9時,d=90滿足。

因此,將每段距離%90即可。

**:

#include

#include

#include

#include

using namespace std;

int f[500002],pos[105],q[500005];

int main()

sort(pos+1,1+m+pos);

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

pos[i]=pos[i-1]+(pos[i]-pos[i-1])%90;//

l=pos[m]+(l-pos[m])%90;//

for(i=1;i<=m;i++)q[pos[i]]++;

f[0]=0;

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

}printf("%d",f[l]);

return

0;}

壓縮dp之noip提高組2005 過河

這題拿到手,很容易想到這樣的乙個dp方程 f i minof 其中f i 表示調到i位置最少需要的石子,a i 表示i位置是否有石子,1表示有,0表示沒有。但是這題的l範圍達到10 9,如果直接採用上面的dp方程只能拿到30分。如何改進呢?我們很快注意到石子個數m最大不差過100,那麼顯然m個石子分...

NOIP提高組2005 過河

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

NOIP 提高組2005 過河

演算法 狀態壓縮型dp 題解 q tx t 1 y 對於q t t 1 x,y一定有解。所以當兩石子間距離long t t 1 時,令long t t 1 重新構造陣列即可。注意 1.輸入的石子位置無序,要排序。2.當s t時特判。3.最終解要在n n t中找最小值 不過資料太水 v include...