過河「程式設計題」

2022-09-23 17:39:10 字數 1350 閱讀 5666

§緣

[noip2005]過河

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

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

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

樣例輸入

102 3 5

2 3 5 6 7

樣例輸出2§解

思路都在**裡,本題的難點在於縮距離,而不是狀態等等

#include

#include

#include

using namespace std;

int l,s,t,n,a[105],f[10005],ans,p[10005];//f[i]表示到第i個位置,至少踩的石頭數量

int main()

sort(a+1,a+1+n);//題目沒說這個是有序的數列

for(int k=90,s=0,i=1;i<=n;i++)//縮距離(lmax=10^9,陣列開不了),k是由乙個二元一次方程解得的不等式中的最大值

//90*100=9000<=10000,所以後面用到的p陣列的大小為10000。

for(int i=1;i<=n;i++)p[a[i]]=1;//有沒有石頭

memset(f,0x3f,sizeof f);//0x3f表示16進製制的3f由於這是陣列初始化,所以3f足夠大了

f[0]=0;ans=f[1];

for(int i=0;i<=a[n];i++)

for(int j=s;j<=t;j++)

f[i+j]=min(f[i+j],f[i]+p[i+j]);//狀態轉移方程式,比較簡單的,很好推出來的

for(int i=a[n];i<=a[n]+t;i++)ans=min(ans,f[i]);

printf("%d",ans);

}§結本題的難點在於縮距離,縮好沒有決定你是否ac。

c 程式設計題 袋鼠過河

乙隻袋鼠要從河這邊跳到河對岸,河很寬,但是河中間打了很多樁子,每隔一公尺就有乙個,每個樁子上都有乙個彈簧,袋鼠跳到彈簧上就可以跳的更遠。每個彈簧力量不同,用乙個數字代表它的力量,如果彈簧力量為5,就代表袋鼠下一跳最多能夠跳5公尺,如果為0,就會陷進去無法繼續跳躍。河流一共n公尺寬,袋鼠初始位置就在第...

每日刷題 過河卒

動態規劃可以解決該問題。為什麼用動態規劃?注意題目中的關鍵一點 只能向下或向右走。此時可以列出表示式 record i j record i 1 j record i j 1 首先 不考慮 馬 存在的情況,即路上沒有障礙。因此可以一路走下去,直接到終點即可。如果考慮 馬 則在 馬 能設計到的範圍內,...

用程式設計解決過河問題

很久沒有做題了,突然很懷念,於是心血來潮,想起了曾經小弟叫我做的這道趣味題,就花了x個小時 此處不好意思打出來,各位腦補吧 的時間,終於解決了它,那種久違的成就感好像又回來了 但是我的方法不是特別好,有點長 以我的水平只能這樣了 不過還是打算把它貼出來,紀念一下。出一道題讓大家思考 有一條河,河邊有...