NOIP提高組2005 過河

2021-07-03 03:37:30 字數 1943 閱讀 3895

過河 (river)

【問題描述】

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

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

【輸入檔案】

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

【輸出檔案】

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

【樣例輸入】

10

2 3 5

2 3 5 6 7

【樣例輸出】

2

【資料規模】

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

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

題解網上很多,這裡主要說下要壓縮到多少。有人測試說壓105能過全部資料,很多人吐槽考試的時候誰會知道是105呢?

這裡主要說下我的證明,如有不足請指出。

設兩個石頭分別在i點和j點,跳躍的路程為s到t。那麼從i點可以跳到i+s到i+t。從j-t到j-s可以跳到j。

顯然當i和j相隔非常非常遠時,從i到i+t中必然可以經過若干次,然後跳到j-t到j的任意一段。

那麼這個距離最少可以等於多少呢?

假設現在從0點開始跳,可以跳到s,2s,3s,4s,5s...

也可以跳到t,2t,3t,4t,5t...

也就是說,從0點開始跳,可以跳到s..t,2s..2t,3s..3t,4s..4t,5s..5t中的任意一段。那麼當kt=(k+1)s時,從0點就可以跳到ks..(k+1)t中的任意一點。此時,隨著k再次增大到k',從第0點總是可以跳到ks..k't的任意一段。所以就可以把大於k的值減小到k,達到優化的目的,即離散化。

k的值為多少呢?觀察上式,kt=(k+1)s,解一下就可以了。接下去讀者自己完成吧。如果不懂看程式。

#include#include#includeusing namespace std;

int f[11000],a[11000],stone[1001];

int main()

else

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

f[0]=0;

for (int i=0;i<=l+t;i++)

for (int j=i-t;j<=i-s;j++)

if (j>=0) f[i]=min(f[i],f[j]+a[i]);

int ans=m;

for (int i=l;i<=l+t;i++) ans=min(ans,f[i]);

printf("%d",ans);

} return 0;

}

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...

壓縮dp之noip提高組2005 過河

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

過河 2023年NOIP全國聯賽提高組

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