C. Standard Free2play --div

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;
}
原文地址:https://www.cnblogs.com/Accepting/p/11656305.html