https://codeforces.com/contest/1238/problem/C
题意:下台阶的时候只有一种方式,拉动当前台阶x的 level,然后当前的台阶关闭,调到下边的台阶x-1,如果台阶x-1是打开的,那么会使他关闭,那么只能到达x-1下面打开的台阶y, 然后判断落差是否大于2,如果大于二的话,只能用一个magic使x-2的台阶打开,然后依次判断。
题解:只要判断x-1台阶和x-1下边的台阶是否相邻,如果相邻的话,直接跳到x-2.否则要用一个magic,并跳到x-1。
AC代码:
#include<bits/stdc++.h> using namespace std; const int N=2E5+7; int arr[N]; void solve(){ int n,m; cin>>n>>m; for(int i=1;i<=m;i++) scanf("%d",&arr[i]); int ans=0; arr[m+1]=0; //当前状态是h,即i=1,只要判断arr[i+1]和arr[i+2]是否相邻就可以了 //如果相邻的话直接到arr[i+2],否则用一个魔法水晶,并到arr[i+1]; for(int i=2;i<=m;i++){ if(arr[i]==arr[i+1]+1) i++; else ans++; } cout<<ans<<endl; } int main(){ int n; cin>>n; while(n--) solve(); return 0; }