每日打卡-16
一.问题描述
农夫约翰有 N头奶牛,编号 1∼N。
约翰让它们排成一排,以便拍照。
最初,奶牛从左到右按照 a1,a2,…,aN 的顺序排列。
但是,约翰希望奶牛从左到右按照 b1,b2,…,bN 的顺序排列。
为此,他需要对队列进行一系列的调整操作。
每次操作可以选择任意一头奶牛并将其向左移动一些位置。
请问,至少需要多少次操作,才能使奶牛按照约翰满意的顺序排列。
二.设计思路
1.i 指针指向 a[0] , j 指针指向b[0],
2.以b数组作为模板,只要 a[i]!=b[j] 我们就一定可以在a数组找到一个相等的数并把它移动到a数组的最前面 ( j 指针并不是与当前i指针指向的数相等,所以 i指针 指向不变 )
3.标记一下 这个找到的数b[j],防止重复找.
4.在b数组上的数一定可以在a数组上找到,不论 a[i] 是否等于 b[j] 都将 j指针指向下一个 j++
5.如果 a[i]==b[j] 继续往后移,i指针与j指针指向的数相等, i++
三.流程图
四.伪代码
1
五.代码实现
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
bool v[N]; //
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++)cin>>b[i];
int ans=0;
for(int i=0,j=0;i<n&&j<n;j++){
while(v[a[i]])i++; //找到第一个没有别标记的数
if(a[i]!=b[j]){ //总能在a上找到与 b[j] 相等的数
ans++;
v[b[j]]=true;
}else {
i++;
}
}
cout<<ans;
return 0;
}