【題解】【[COCI2010-2011#2] KNJIGE】
阿新 • • 發佈:2020-10-05
題目大意
給出序列a,每次操作將序列中的任意一個元素移動到最前面,求使序列有序的最小操作次數。
分析
首先,我們假設所有元素“完全無序”,例如序列:{ 8,7,6,5,4,3,2,1 },則此時需要進行操作的次數就是 7 次(只有 8 不被移動)。而如果我們將編號最大的書向前移動,變成 { 7,8,6,5,4,3,2,1 } ,可以不被移動的書就變成了 7、8 兩本。由此我們可以發現 已經按照有序的順序擺放的書本不用被移動。
但是這還不夠,我們來看這個序列:{ 7,1,2,3,4,5,6,8 }。我們發現,儘管這個序列中的 1,2,3,4,5,6 已經按照字典序擺放好了,但是我們依然要進行 6 次操作才能達成目標。因為元素“8”之前的有序元素“7”並沒有被正確擺放。所以我們可以得到:按字典序從大到小排列時,字典序較大的元素與其前一個有序元素之間的所有元素都需要被移動。
通過以上分析,我們就可以得出本題的解法:從後向前遍歷整個序列,從字典序最大的元素開始,依次按字典序從大到小統計所有已經按順序擺放的元素,這些元素就可以不被操作。
分析結束,上程式碼!
Code
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,ans; 4 int a[300005]; 5 int main() 6 { 7 scanf("%d",&n); 8 for(int i=1;i<=n;i++) 9 scanf("%d",&a[i]); 10 ans=n;11 for(int i=n;i>=1;i--) 12 if(a[i]==ans) //先假設所有書都需要被操作,ans=n, 13 ans--; //找到不需要被操作的書後ans--; 14 printf("%d",ans); 15 }
完結撒fa~