[noj 1557] Team of Slime

不知道爲什麼同一組數據要豎着寫,這樣看起來有點彆扭。

題意是:給你一個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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章