不知道爲什麼同一組數據要豎着寫,這樣看起來有點彆扭。
題意是:給你一個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;
}