不知道为什么同一组数据要竖着写,这样看起来有点别扭。
题意是:给你一个n,然后给你1~n的一个排列。每次可以挑一个数放到数组的开头,问经过最少多少次这样的操作,可以将这个数列从小到大排好。
样例解释:
2
1 3 2 4
先将2移到开头,变成2 1 3 4,然后将1移到开头,变成1 2 3 4,所以答案是2.
考虑这个样例,为什么一开始移动2呢,因为3和4已经相对有序了,已经整齐了,所以接下来要动还没整齐的2了。这道题是移动到开头,所以移动一个数字以后,改变的是这个数字的相对有序顺序,而不会改变其他数的相对有序顺序。
如2 1 3 4,2 3和4已经相对有序了,接下来只要调整1的相对有序顺序就行了,也就是还差一个数字就有序了,所以答案是1。
再看1 5 2 4 3,相对有序的只有一个5,所以要先移动4,再移动3、2和1。
这样一来题目就很清晰了,从最大的数来看,有几个数相对无序,答案就是几。
#include<iostream>
using namespace std;
int num[300005];
int main()
{
int n;
while(~scanf("%d", &n))
{
int t = n;
for(int i = 1; i <= n; i++)
scanf("%d", &num[i]);
for(int i = n; i; i--)
if(num[i] == t)t--;
printf("%d\n", t);
}
return 0;
}