CSU——2130: Permutations 湖南多校第八场

Description

给定两个1~n的排列A, B。每次可以把A的最后一个数取出,插入到A的任何一个位置(最前面或者任何两个数中间)。 问最少几次可以把A转化为B。

Input

第一行为一个整数n。 第二行为1~n的一个排列,表示A。 第三行为1~n的一个排列,表示B。

Output

一个整数即最少操作次数。

Sample Input

5
1 5 2 3 4
1 2 3 4 5

Sample Output

3

思路:这题题意很简单,每次动A数组的最后一个,然后看最少几步能变成B,其实找到第一个逆序的数就可以了。给B数组的数标记一下位置,如果发现逆序了,那么A数组自逆序后面的个数就是ans。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <stdio.h>
#include <map>
#include <set>
using namespace std;

const int maxn=200005;
int B[maxn],C[maxn],D[maxn];
int main(){
    int n,i;
    cin>>n;
    for(i=1;i<=n;i++)
        scanf("%d",&C[i]);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&D[i]);
        B[D[i]]=i;
    }
    int ma=0,ans=-1;
    for(i=1;i<=n;i++)
    {
        if(B[C[i]]<ma)
        {
            ans=i;
            break;
        }
        else ma=B[C[i]];
    }
    if(ans!=-1)
        cout<<n-ans+1<<endl;
    else
        cout<<0<<endl;
    return 0;
}


/**********************************************************************
	Problem: 2130
	User: jk1601zr
	Language: C++
	Result: AC
	Time:140 ms
	Memory:4368 kb
**********************************************************************/



猜你喜欢

转载自blog.csdn.net/abandoninged/article/details/80560207
今日推荐