时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定一个1-N的排列A1, A2, ... AN,每次操作小Hi可以选择一个数,把它放到数组的最左边。
请计算小Hi最少进行几次操作就能使得新数组是递增排列的。
输入
第一行包含一个整数N。
第二行包含N个两两不同整数A1, A2, ... AN。(1 <= Ai <= N)
对于60%的数据 1 <= N <= 20
对于100%的数据 1 <= N <= 100000
输出
一个整数代表答案
- 样例输入
-
5 2 3 1 4 5
- 样例输出
-
1
想象一下把所有小的元素一次放到前面,必须从数组的尾部开始遍历,不然会乱。简化一下思路就是把最大的提出来放在最前面,然后把第二大的放在最前面,然后把第三大的放在最前面.....然后就好了。
ac代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<vector> 6 #include<iomanip> 7 using namespace std; 8 9 //1523:数组重排2 10 const int maxn = 1e5 + 5; 11 int main() 12 { 13 int n, a[maxn],pos[maxn]; 14 int res = 0; 15 cin >> n; 16 for (int i = 1;i <= n;i++) 17 { 18 cin >> a[i]; 19 pos[a[i]] = i; 20 } 21 int now = 0; 22 for (int i = n;i >1;i--) 23 { 24 if (pos[i] < pos[i - 1]) 25 { 26 pos[i-1] = now--; 27 res++; 28 } 29 30 } 31 cout << res << endl; 32 return 0; 33 }