题目别看错了,好像挺多人都读错了...
然后显然可以贪心,只有在需要用 $\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; }