這個是題幹:
這是一道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 的...