AGC024B Backfront

题目大意

给你一个1~n的排列

你有两个操作:将一个数移到最后或将一个数移到最前

问将排列排序最少要几次操作

分析

年纪大了,脑子不行了..

实际我们只需求出对与一段连续的数它在排列中已经有序的最长长度即可

剩下的数暴力放到最前/最后即可

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int pl[200100];
int main(){
    int n,m,i,j,k,ans=0,len=1;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
      scanf("%d",&k);
      pl[k]=i;
    }
    for(i=1;i<n;i++)
      if(pl[i+1]>pl[i])len++;
        else ans=max(ans,len),len=1;
    ans=max(ans,len);
    cout<<n-ans<<"\n";
    return 0;
}
posted @ 2019-08-20 18:39  水题收割者  阅读(175)  评论(0编辑  收藏  举报