hihoCoder - 1523、数组重排2

#1523 : 数组重排2

描述

给定一个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


限制

时间限制:10000ms
单点时限:1000ms
内存限制:256MB


思路

从数组的最后向前遍历,令flag=n,如果碰见a[i]==n,则n-1。遍历完n即为答案。原理即为此题是将不符合递增序列的数字放置最前方,则必定是将所有不符合序列的数字中最大的一个放到最前,因此只要将符合序列的数字个数找出删去即可。


题解

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
Author: Yuki
GitHub: https://github.com/Yuki-14544869/
Blog: https://yuki-14544869.github.io/
*/
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <utility>
#include <iostream>
#include <algorithm>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000") //手动扩栈
typedef long long LL;
#define INF = 0x3f3f3f3f;
#define eps 1e-10
#define ff(a, b, c, d) for(int a=b; a<c; a+=d)
#define fff(a, b, c, d) for(int a=b; a>=c; a-=d)
#define mm(a, b) memset(a, b, sizeof(a))
const double PIE = acos(-1.0);
void init() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
}


const int N = 100000+50;
int n;
int a[N] = {0};

int main() {
init();
cin >> n;
ff(i,0,n,1)
cin >> a[i];
int MAX = n;
fff(i,n-1,0,1)
if(a[i] == MAX)
MAX--;
cout << MAX << endl;
return 0;
}

Java

1
Writting...
文章作者: Yuki-
文章链接: /hihoCoder-1523、数组重排2/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 #39C5BB