B - Backfront(atcoder)

B - Backfront

Time limit : 2sec / Memory limit : 1024MB

Score : 500 points

Problem Statement

You are given a sequence (P1,P2,…,PN) which is a permutation of the integers from 1 through N. You would like to sort this sequence in ascending order by repeating the following operation:

  • Choose an element in the sequence and move it to the beginning or the end of the sequence.

Find the minimum number of operations required. It can be proved that it is actually possible to sort the sequence using this operation.

Constraints

  • 1≤N≤2×105
  • (P1,P2,…,PN) is a permutation of (1,2,…,N).
  • All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
P1
:
PN

Output

Print the minimum number of operations required.

Sample Input 1

Copy

4
1
3
2
4

Sample Output 1

Copy

2

For example, the sequence can be sorted in ascending order as follows:

  • Move 2 to the beginning. The sequence is now (2,1,3,4).
  • Move 1 to the beginning. The sequence is now (1,2,3,4).

Sample Input 2

6
3
2
5
1
4
6

Sample Output 2

4

Sample Input 3

8
6
3
1
2
7
4
8
5

Sample Output 3

5
其实就是求最长连续上升子序列maxlen,那么n-maxlen就是ans,这里用到了dp,会方便很多
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int dp[2*maxn];
int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        int ans=0,x;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            dp[x]=max(dp[x],dp[x-1]+1);
            ans=max(ans,dp[x]);
        }
        printf("%d\n",n-ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41061455/article/details/81180824