学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考青铜组别比赛学习过程中的题目,记录每一个瞬间。
附上汇总贴:USACO历年青铜组真题解析 | 汇总-CSDN博客
【题目描述】
在一个似曾相识的场景中,Farmer John 正在将他的 N 头奶牛(1≤N≤105)排成一排(为了方便将它们按 1⋯N 编号),以便拍照。
最初,奶牛从左到右按照 a1,a2,⋯,aN 的顺序排列。Farmer John 的目标是按照 b1,⋯,bN 从左到右的顺序排列奶牛。为此,他可以对排列顺序进行一系列修改。每次修改为选择一头奶牛并将其向左移动一些位置。
请计算农民约翰按所需顺序排列奶牛所需的最少修改次数。
【输入】
输入的第一行包含 N,第二行包含 a1,a2,⋯,aN,第三行包含 b1,b2,⋯,bN 。
【输出】
输出产生 Farmer John 所需顺序所需的最少修改次数。
【输入样例】
5
5 1 3 2 4
4 5 2 1 3
【输出样例】
2
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n, ans=0;
int a[100005], b[100005];
int main()
{
cin >> n; // 输入n
for (int i=1; i<=n; i++) { // for循环遍历n个数
cin >> a[i]; // 记录n个数
}
for (int i=1; i<=n; i++) { // for循环遍历n个数
int tmp;
cin >> tmp; // 记录n个数的下标
b[tmp] = i;
}
int pre = b[a[1]]; // 定义起始位置为a数组中第1个数的位置
for (int i=2; i<=n; i++) { // 依次遍历后续n-1个数
if (b[a[i]]> pre) { // 如果当前这个数的位置比前一个数大
pre = b[a[i]]; // 说明相对位置没有变化,更新下一次要比较的位置
} else { // 否则说明相对位置发生了改变
ans++; // 需要挪一次
}
}
cout << ans << endl; // 返回挪的次数
return 0;
}
【运行结果】
5
5 1 3 2 4
4 5 2 1 3
2