在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。 由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點: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只包括乙個整數,表示青蛙過河最少需要踩到的石子數。
輸入樣例#1:
10輸出樣例#1:2 3 5
2 3 5 6 7
2對於30%的資料,l≤10000l \le 10000l≤10000;
對於全部的資料,l≤109l \le 10^9l≤109。
2005提高組第二題
【題解】
dp[i]表示到i點,最少踩多少石頭
dp[i] = min * [i點沒有石頭且 s <= j <= t] + min * [i有石頭且s <= j <= t]
離散化,採用1..10的公倍數2520,距離2520可以被任意1..10長度路徑走出來
1 #include 2 #include 3 #include 4 #include 5 #include 6洛谷p1052#define max(a, b) ((a) > (b) ? (a) : (b))
7#define min(a, b) ((a) < (b) ? (a) : (b))
89 inline void read(int &x)
1016
17const
int inf = 0x3f3f3f3f;18
const
int maxn = 100 + 10;19
const
int maxm = 2520;20
21int
l, s, t, m;
22int
yuan[maxn], lisan[maxn];
23int dp[1000000 + 10
];24
25int
main()
2638
if(l - lisan[m] >= maxm)l = lisan[m] + (l - yuan[m]) %maxm;
39int now = 1
;40 memset(dp, 0x3f, sizeof
(dp));
41 dp[0] = 0;42
for(register int i = s;i <= l + t - 1;++i)
4349
if(i == lisan[now])++ dp[i], ++now;50}
51int ans =inf;
52for(register int i = l;i <= l + t - 1;++ i)ans =min(ans, dp[i]);
53 printf("%d"
, ans);
54return0;
55 }
洛谷 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的點表示橋的終點。青蛙從橋的起...