洛谷 P1052過河

2021-08-21 19:02:10 字數 1303 閱讀 7137

這個是題幹:

這是一道noip2023年的提高組的題,那道題一看,就是要用動態規劃,狀態轉移方程也十分簡單。只需要考慮是從哪個地方來的,看看即將到達的點是否有石子。用一維陣列 f[x] 表示第x位的步數(額,這只是30分的寫法,l 的取值太大,陣列承受不了)

之後,我又想騙一點分,就特判了一下s==t的情況,結果竟然又過了乙個點,簡直就是玄學。。。

#include

#include

using

namespace

std;

const

int maxn=20000100;

int l,s,t,m,ans,f[maxn],b[110];

bool a[maxn];

void prepare()

}int main()

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

a[b[i]]=true;

prepare();

int ans=maxn;

for(int i=l;i<=l+t-1;++i)

}cout

0;}

在這裡,需要用到乙個神奇的的定理,也就是小凱的煩惱(2023年提高組第一題)需要用到的。定理描述如下

有兩個互質的自然數p,q,不能用p*x+q*y表示的最大整數是

p*q+-p-q(x,y均為正整數)

有興趣的可以證明一下~~~

最後附上**:

#include

#include

#include

#include

using

namespace

std;

const

int maxn=100000;

int l,s,t,m,ans,st,f[maxn],b[maxn];

bool a[maxn];

void qsort(int l,int r)

}qsort(l,j);

qsort(i,r);

}void prepare()

}int main()

b[m+1]=l;

int add=(t-1)*t;

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

else

}prepare();

int ans=maxn;

for(int i=st;i<=st+t-1;++i)

if(f[i]!=-1)

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

cout

0;}

洛谷 P1052 過河

題目 過河 思路 因為l的值太大,而實際有石子的地方卻並不多,所以要先進行離散化。即將每個石子之間的差距都控制在剛好比t大一點的位置,這樣就不會影響最終結果。令f i 表示跳過前i個位置需要最少踩得石頭數量,轉移方程f i min f i j cnt i f i j s,t 注意最後的輸出是min,...

洛谷 P1052 過河

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

洛谷 P1052 過河

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