NOIP2005 過河題解

2021-07-04 06:23:17 字數 1933 閱讀 3370

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

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

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

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

10 2 3 5

2 3 5 6 7

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

對於全部的資料, l <= 1≤l≤109

,1≤s≤t≤10,1≤m≤100。

因為青蛙不能回頭,滿足無後效性原則,因此此題可用動規來解決

很容易想到:

對於任一位置x , 只能由前面[x-t , x-s]這個範圍的位置跳過來,因此只要先求出這些位置踩的石子數,找個最少的位置跳過來就ok。因此很容易想到動態轉移方程: f[

x]=m

in(f

[x−j

])+s

tone

[x](

j∈[s

,t])

f[x]表示從橋頭跳到x處需踩的最少石子數,stone[x]表示x處是否是石頭(1表示是,0表示否)。

但對於10億的資料,空間承受不了。

怎麼辦???

我們發現在長達10億的橋上,只有最多100個石子,10億中的100就像人體的幾個細胞。

中間那麼多的空隙該如何填補呢???

設第k個石子座標為x,第k-1個石子和第k個石子間距離足夠大,則青蛙從兩個石子間跳到第k個石子及之後的位置有:x、x+1、x+2、x+3……x+t-1。如果我們能保證,將石子k-1和石子k之間的距離縮短(即減少狀態)後,青蛙依然能跳到這些位置,則可以平移。而這一點我們可以通過在兩個石子間保留1個最小公倍數單位長度得到保證。

特別的:當s=t時,只需考查石子是否是s的倍數即可。這種情況單獨考查。

至此我們得到了此題的解決方法。

#include 

#include

#define min(a, b) ((a)<(b)?(a):(b))

int num[101];

int f[10101];

int stone[10101];

int com(const

void *a, const

void *b)

int main(int argc, char **argv)

if(s == t)

}printf("%d\n", j);

return

0; }

qsort(num, m + 1, sizeof(int), com);

for(i = 1, j = 0; i <= m; i++)else

}k = j + 100;

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

f[i] = min(f[i], f[i - j] + stone[i]);}}

printf("%d\n", f[k]);

return

0;}

業精於勤荒於嬉,行成於思毀於隨

noip2005提高組過河

介於被這道題折磨了一晚上,因此很有必要記錄下來做動態規劃及狀態壓縮中易錯事項。題目大意 共m個石子,求青蛙每次以s到t步從座標0跳過座標l踩到的最小石子數。樣例資料 輸入10 2 3 5 2 3 5 6 7 輸出資料範圍 1 l 10 9 1 s t 10,1 m 100 初看此題,可以想到動態規劃...

NOIP2005提高組 過河

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

noip2005 過河 解題報告

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