在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點:0,1,…,l(其中l是橋的長度)。座標為0的點表示橋的起點,座標為l的點表示橋的終點。青蛙從橋的起點開始,不停的向終點方向跳躍。一次跳躍的距離是s到t之間的任意正整數(包括s,t)。當青蛙跳到或跳過座標為l的點時,就算青蛙已經跳出了獨木橋。
題目給出獨木橋的長度ll,青蛙跳躍的距離範圍s,ts,t,橋上石子的位置。你的任務是確定青蛙要想過河,最少需要踩到的石子數。
第一行有11個正整數 l (1≤l≤10^9),表示獨木橋的長度。
第二行有33個正整數s,t,m,分別表示青蛙一次跳躍的最小距離,最大距離及橋上石子的個數,其1≤s≤t≤10,1≤m≤100。
第三行有m個不同的正整數分別表示這m個石子在數軸上的位置(資料保證橋的起點和終點處沒有石子)。所有相鄰的整數之間用乙個空格隔開。
乙個整數,表示青蛙過河最少需要踩到的石子數。
1023
5235
67
2
這道題我們分析一下資料,如果只是單純的dp是會爆(各種意義上)的。但是通過一道玄學題目小凱的疑惑,我們可以知道另乙個玄學的道理:所有大於t * (t-1)的路徑都可以壓縮成t * (t-1)。那麼我們直接dp就好了。(當然t==s的情況是要特判的)
程式如下:
#include
#include
#include
using
namespace std;
int l,s,t,n,sum;
int a[
1100
],f[
1000010
],b[
1000010];
intmain()
if(s==t)
sort
(a+1
,a+1
+n);
f[n+1]
=min
(l-a[n],90
);sum=0;
for(
int i=
1;i<=n;i++
) sum+
=f[n+1]
;for
(int i=
1;i<=sum+
9;i++
)int ans=
0x3f3f3f3f
;for
(int i=sum;i<=sum+
9;i++
) ans=
min(ans,f[i]);
cout
}
洛谷 P1052 過河
題目 過河 思路 因為l的值太大,而實際有石子的地方卻並不多,所以要先進行離散化。即將每個石子之間的差距都控制在剛好比t大一點的位置,這樣就不會影響最終結果。令f i 表示跳過前i個位置需要最少踩得石頭數量,轉移方程f i min f i j cnt i f i j s,t 注意最後的輸出是min,...
洛谷 P1052過河
這個是題幹 這是一道noip2005年的提高組的題,那道題一看,就是要用動態規劃,狀態轉移方程也十分簡單。只需要考慮是從哪個地方來的,看看即將到達的點是否有石子。用一維陣列 f x 表示第x位的步數 額,這只是30分的寫法,l 的取值太大,陣列承受不了 之後,我又想騙一點分,就特判了一下s t的情況...
洛谷 P1052 過河
在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l0,1,l 其中 ll 是橋的長度 座標為 00 的點表示橋的起點,座標為 ll 的...