农夫约翰有 N 头奶牛,编号 1∼N。
约翰让它们排成一排,以便拍照。
最初,奶牛从左到右按照 a1,a2,…,aN 的顺序排列。
但是,约翰希望奶牛从左到右按照 b1,b2,…,bN 的顺序排列。
为此,他需要对队列进行一系列的调整操作。
每次操作可以选择任意一头奶牛并将其向左移动一些位置。
请问,至少需要多少次操作,才能使奶牛按照约翰满意的顺序排列。
输入格式
第一行包含整数 N。
第二行包含 a1,a2,…,aN,这是一个 1∼N 的排列。
第三行包含 b1,b2,…,bN,这是一个 1∼N 的排列。
输出格式
一个整数,表示所需的最少操作次数。
数据范围
1≤N≤105
输入样例1:
5
1 2 3 4 5
1 2 3 4 5
输出样例1:
0
样例1解释
本样例中,奶牛已经按照约翰满意的顺序排列,因此无需任何操作。
输入样例2:
5
5 1 3 2 4
4 5 2 1 3
输出样例2:
2
样例2解释
在本样例中,至少需要 2 次操作,具体如下:
让奶牛 4 向左移动 4 位。
让奶牛 2 向左移动 2 位。
队列变化如下:
5 1 3 2 4
-> 4 5 1 3 2
-> 4 5 2 1 3
代码:
// 贪心双指针 如果该位置不是正确的那就把正确的放到该位置上 原来的右移
//(相当于正确的数所在的位置置为0 原来的不动)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N],b[N],p[N];
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n ; i++)
{
cin >> a[i];
p[a[i]] = i;
}
for(int i = 1; i <= n; i++)
cin >> b[i];
int res = 0;
for(int i = 1, j= 1; j <= n; j++)
{
while(!a[i])i++;
if(a[i] == b[j])// 不需要动
i ++;
else
{
int k = p[b[j]];
a[k] = 0; //直接置为0
res ++;
}
}
cout << res << endl;
return 0;
}