你的弟弟给你安排了一个任务,他给了你1到N个数字的乱序排列,现在你想给你的弟弟秀一波操作,操作最少的次数把序列变成1到N的顺序排列,每次操作你可以选择序列中的一个数字并把它移动到序列的头部或尾部。
Input
包含多组测试数据。
每组测试数据的第一行为正整数N,表示排列的长度。
第二行为N个数字的乱序排列。
n≤100000
Output
输出最少的操作次数
Sample Input
6
6 3 2 4 5 1
Sample Output
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; }