在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點:0,1,……,l(其中l是橋的長度)。座標為0的點表示橋的起點,座標為l的點表示橋的終點。青蛙從橋的起點開始,不停的向終點方向跳躍。一次跳躍的距離是s到t之間的任意正整數(包括s,t)。當青蛙跳到或跳過座標為l的點時,就算青蛙已經跳出了獨木橋。題目給出獨木橋的長度l,青蛙跳躍的距離範圍s,t,橋上石子的位置。你的任務是確定青蛙要想過河,最少需要踩到的石子數。
對於30%的資料,l <= 10000;
對於全部的資料,l <= 10^9。
輸入格式輸入的第一行有乙個正整數l(1 <= l <= 10^9),表示獨木橋的長度。第二行有三個正整數s,t,m,分別表示青蛙一次跳躍的最小距離,最大距離,及橋上石子的個數,其中1 <= s <= t <= 10,1 <= m <= 100。第三行有m個不同的正整數分別表示這m個石子在數軸上的位置(資料保證橋的起點和終點處沒有石子)。所有相鄰的整數之間用乙個空格隔開。
輸出格式
輸出只包括乙個整數,表示青蛙過河最少需要踩到的石子數。
樣例輸入10 2 3 5
2 3 5 6 7
樣例輸出
2
1s
noip2005 第二題以前做的這題,今天翻出來重新理解了一下,把以前沒有搞懂的地方搞懂了。
很明顯,這題直接dp的話肯定過不了,畢竟橋實在太長了,直接dp會列舉很多不必要的運算,因此我們可以想到將兩塊石頭之間的距離縮短,將這段距離%d,d代表青蛙肯定可以跳的長度,要盡量小。這個長度可以手推一下:跳躍距離為1-10,我們將單個的,也就是s==t的情況單獨處理,剩下的就來算d。
s=1時,d=1(盡量小);
s=2,t=3+時,d為偶數(用s來跳,因為s最小);
s=3時,d為3的倍數;
s=4時,d為4的倍數;
s=5時,d為5的倍數;
此時d最小為60。
s=6時,d=60;
s=7時,要注意,t肯定》=8,將s和t弄在一起搞,s+s+1=15,d=60依然滿足;
s=8時,60已無法滿足,考慮要滿足上面的,d可以為90,此時t>=9,用t來跳。
s=9時,d=90滿足。
因此,將每段距離%90即可。
**:
#include
#include
#include
#include
using namespace std;
int f[500002],pos[105],q[500005];
int main()
sort(pos+1,1+m+pos);
for(i=1;i<=m;i++)
pos[i]=pos[i-1]+(pos[i]-pos[i-1])%90;//
l=pos[m]+(l-pos[m])%90;//
for(i=1;i<=m;i++)q[pos[i]]++;
f[0]=0;
for(i=1;i<=l;i++)
}printf("%d",f[l]);
return
0;}
壓縮dp之noip提高組2005 過河
這題拿到手,很容易想到這樣的乙個dp方程 f i minof 其中f i 表示調到i位置最少需要的石子,a i 表示i位置是否有石子,1表示有,0表示沒有。但是這題的l範圍達到10 9,如果直接採用上面的dp方程只能拿到30分。如何改進呢?我們很快注意到石子個數m最大不差過100,那麼顯然m個石子分...
NOIP提高組2005 過河
過河 river 問題描述 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的...
NOIP 提高組2005 過河
演算法 狀態壓縮型dp 題解 q tx t 1 y 對於q t t 1 x,y一定有解。所以當兩石子間距離long t t 1 時,令long t t 1 重新構造陣列即可。注意 1.輸入的石子位置無序,要排序。2.當s t時特判。3.最終解要在n n t中找最小值 不過資料太水 v include...