洛谷 P1052 過河

2022-04-04 16:18:21 字數 1575 閱讀 3075

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

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

輸入格式:

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

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

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

輸出格式:

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

輸入樣例#1: 複製

10

2 3 5

2 3 5 6 7

輸出樣例#1: 複製

2

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

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

2005提高組第二題

思路:動規。

#include#include

#include

#include

using

namespace

std;

int f[10005],far[10005],a[10005],flag[10005

],p,s,t,n;

intmain()

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

scanf("%d

",&a[i]);

sort(a+1,a+n+1

); a[

0]=0

; f[

0]=0

; far[n+1]=min(p-a[n],100

); p=0

;

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

far[i]=min(a[i]-a[i-1],90),p+=far[i],flag[p]=1

; p+=far[n+1

];

for(int i=1;i<=p+9;i++)

int minn=int_max-1

;

for(int i=p;i<=p+9;i++)

minn=min(minn,f[i]);

printf("%d

",minn);

}

洛谷 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,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的點表示橋的終點。青蛙從橋的起...