hihocoder 1523:数组重排2

题目链接

时间限制: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 }

 

posted on 2017-06-24 13:52  炮二平五  阅读(310)  评论(0编辑  收藏  举报

导航