洛谷 P1052 過河 壓縮路徑

2022-05-20 01:48:08 字數 2163 閱讀 9435

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

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

輸入格式:

第一行有1個正整數l(1≤l≤109),表示獨木橋的長度。

第二行有3個正整數s,t,m,分別表示青蛙一次跳躍的最小距離,最大距離及橋上石子的個數,其中1≤s≤t≤10,1≤m≤100。

第三行有m個不同的正整數分別表示這mm個石子在數軸上的位置(資料保證橋的起點和終點處沒有石子)。所有相鄰的整數之間用乙個空格隔開。

輸出格式:

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

輸入樣例#1: 複製

10

2 3 5

2 3 5 6 7

輸出樣例#1: 複製

2
對於30%的資料,l≤10000;

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

首先看到這道題目很容易想到跑dp的哇  然而定睛一看這個資料範圍.....  1e9...

再見再見 是在下輸了...

但是想來想去還是只有垃圾dp  然後又看到石頭的數量是特別少的 所以很容易出現兩個石頭之間的路徑特別特別長

所以就考慮壓縮路徑

想想怎麼壓縮呢 又可以看到每一步跳的範圍也是很小的 在 $10$ 以內 所以考慮用 $lcm$ 壓縮路徑 並且使這段路徑可以正常跑dp

怎麼用 $lcm$ 壓縮呢  如圖 對於兩塊石頭 $a,b$ 的一段路徑 假定我們的壓縮路徑每段長度為 

$2520$ 

($1$ 到 

$10$ 的

上面是壓縮之後的 假設這一步距離為 $x$ 那麼有他按照這個步伐不變 跳出壓縮路徑之後仍然落在這個點上

設跳完這段路徑要

$k$ 步 則需要判斷

$2520 + x$ 與 

$k * x$

的關係因為 

$2520$ 是 

$x$ 

的倍數 所以 

$x | 2520 + x$ 也就是說他會跳在同乙個點 壓縮路徑成功

所以具體實現就是兩塊石頭之間的路徑長度模 

$2520$ 剩下的長度正常跑 

$dp$ 

就可以了

**

#include using

namespace

std;

const

int n = 3 * 1e6 + 5

;const

int mod = 2520

;int

n,l,s,t;

int dp[n],st[300],f[300

];bool

vis[n];

int dis[105][105

];int

main( )

st[n + 1] =l;

sort(st + 1,st + n + 2

);

int las = 0

; f[

0] = 0

; memset(dp,

0x3f3f3f,sizeof

(dp));

dp[0] = 0

;

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

for(int i = 1;i <= f[n + 1] + t;i ++)

}int ans = 10000000

;

for(int i = f[n + 1];i <= f[n + 1] + t;i ++)

ans =min(ans,dp[i]);

printf("%d

",ans);

}

洛谷 P1052 過河 DP 路徑壓縮

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

洛谷 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的情況...