福州大学第十五届程序设计竞赛 D - 给力的移动 FZU - 2287 最长连续子序列 O(n)

你的弟弟给你安排了一个任务,他给了你1到N个数字的乱序排列,现在你想给你的弟弟秀一波操作,操作最少的次数把序列变成1到N的顺序排列,每次操作你可以选择序列中的一个数字并把它移动到序列的头部或尾部。


Input
包含多组测试数据。


每组测试数据的第一行为正整数N,表示排列的长度。


第二行为N个数字的乱序排列。


n≤100000


Output
输出最少的操作次数


Sample Input
6
6 3 2 4 5 1
Sample Output

3

思路:最长连续子序列

#include <iostream>
#include <algorithm>
#include <vector>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <map>
#include <set>
#include <cmath>
#include <queue>
using namespace std;
typedef long long ll;
const int N = 1e5+5;
int a[N];
int vis[N];
int main()
{
    int n;
    while(cin>>n){
       memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
            cin>>a[i];
        int maxa=-1;
        for(int i=1;i<=n;i++){
            vis[a[i]]=vis[a[i]-1]+1;
            maxa=max(maxa,vis[a[i]]);
        }
        printf("%d\n",n-maxa);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/deepseazbw/article/details/80577202