0
点赞
收藏
分享

微信扫一扫

拍照2(春季每日一题 52)

农夫约翰有 拍照2(春季每日一题 52)_贪心 头奶牛,编号 拍照2(春季每日一题 52)_贪心_02

约翰让它们排成一排,以便拍照。

最初,奶牛从左到右按照 拍照2(春季每日一题 52)_i++_03 的顺序排列。

但是,约翰希望奶牛从左到右按照 拍照2(春季每日一题 52)_数据_04 的顺序排列。

为此,他需要对队列进行一系列的调整操作。

每次操作可以选择任意一头奶牛并将其向左移动一些位置。

请问,至少需要多少次操作,才能使奶牛按照约翰满意的顺序排列。

输入格式
第一行包含整数 拍照2(春季每日一题 52)_贪心

第二行包含 拍照2(春季每日一题 52)_i++_03,这是一个 拍照2(春季每日一题 52)_贪心_02 的排列。

第三行包含 拍照2(春季每日一题 52)_数据_04,这是一个 拍照2(春季每日一题 52)_贪心_02 的排列。

输出格式
一个整数,表示所需的最少操作次数。

数据范围
拍照2(春季每日一题 52)_ios_10

输入样例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
#include<iostream>

using namespace std;

const int N = 100010;

int n;
int a[N], b[N], p[N];

int main(){

scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", &a[i]), p[a[i]] = i;
for(int i = 0; i < n; i++) scanf("%d", &b[i]);

int res = 0;
for(int i = 0, j = 0; i < n; i++){

while(!a[j]) j++;
if(a[j] != b[i]) a[p[b[i]]] = 0, res++;
else j++;
}

printf("%d\n", res);

return 0;
}


举报

相关推荐

0 条评论