车辆排序
CodeForces 606C
Description
一个无限长的铁路有一个载着n辆车的火车,每一辆车的编号从1到n。每一辆车的编号都是不同的。他们的顺序是无序的。
David Blaine想要将这些车按照他们的编号从小到大排序,他可以做两种操作。第一种,他可以将一辆车从任意位置移动到所有车的第一位。第二种,他可以将一辆车从任意位置移动到所有车的最后一位。
不过他很懒,所以他想知道将这些车排好序最少做几次操作就可以。
Input
第一行输入包含一个整数n (1?≤?n?≤?100?000) -- 车的数目
第二行包含n个整数 pi (1?≤?pi?≤?n, pi?≠?pj if i?≠?j) - 车的编号的初始序列
Output
输出一个整数 - 将车辆排好序的最小操作次数
Sample Input
5
4 1 2 5 3
4
4 1 3 2
Sample Output
2
2
Hint
CodeForces 606C
Description
一个无限长的铁路有一个载着n辆车的火车,每一辆车的编号从1到n。每一辆车的编号都是不同的。他们的顺序是无序的。
David Blaine想要将这些车按照他们的编号从小到大排序,他可以做两种操作。第一种,他可以将一辆车从任意位置移动到所有车的第一位。第二种,他可以将一辆车从任意位置移动到所有车的最后一位。
不过他很懒,所以他想知道将这些车排好序最少做几次操作就可以。
Input
第一行输入包含一个整数n (1?≤?n?≤?100?000) -- 车的数目
第二行包含n个整数 pi (1?≤?pi?≤?n, pi?≠?pj if i?≠?j) - 车的编号的初始序列
Output
输出一个整数 - 将车辆排好序的最小操作次数
Sample Input
5
4 1 2 5 3
4
4 1 3 2
Sample Output
2
2
Hint
在第一个样例中,将编号为4的车放到最后,然后把编号为5的车放到最后就可以了,总共是2次操作
#include <stdio.h>
#include <stdlib.h>
//给出一个序列, 任一个数可以放到序列末尾或者最前, 输出最小操作数
//hash一下每个数出现的位置, n减最长连续上升长度即为答案
//用另外一个数组储存最长序列长度,只要在输入得时候判断比它小一的元素是否在其左边
//是,则其下标为左边小一的元素下标加一,否,则为一
int main()
{
int array[100001];
int loc[100001];//存1到n每个数的位置
int n;
int len;//当前序列长度
int max;//最长序列长度
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
scanf("%d",&array[i]);
loc[array[i]]=i;
}
max=0;
len=1;
for(int j=2;j<=n;j++){
if(loc[j]>loc[j-1])
len++;
else{
max=max>len?max:len;
len=1;
}
}
max=max>len?max:len;
printf("%d\n\n",n-max);
}
return 0;
}