題目別看錯了,好像挺多人都讀錯了...
然后顯然可以貪心,只有在需要用 $\text{magic crystals}$ 的時候才用
那么直接模擬即可
如果初始相鄰兩個突出的平台高度不連續那么我們顯然可以直接從上面一步步操作到達下面的平台的上面一個位置
此時考慮如果我們直接操作,那么下面那個平台(設為 $x$)就會縮起來,然后就會掉到更下面的平台(設為 $y$)
如果當前和更下面的平台 $y$ 高度超過 $2$ 了,那么為了不摔死只能用一次 $\text{magic crystals}$
並且用在 $x$ 位置和用在 $x$ 下面一個位置(不是平台)都是一樣的,那么直接用在 $x$ 位置就好了
如果和 $y$ 高度不超過 $2$ ,那么我們顯然直接操作然后落到 $y$ 即可
這樣一定是最優的,直接按着思路模擬,注意細節
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } const int N=2e5+7; int Q,n,m,a[N]; int main() { Q=read(); while(Q--) { n=read(),m=read(); for(int i=1;i<=m;i++) a[i]=read(); int ans=0; for(int i=2;i<=m;i++) { if(n<=a[i]) continue; if(n!=a[i]+1) n=a[i]+1; if(i<m) { if(a[i+1]==a[i]-1) n=a[i+1]; else ans++,n=a[i]; continue; } if(n>2) ans++; break; } printf("%d\n",ans); } return 0; }