现在有两个长度为n的排列p和s。要求通过交换使得p变成s。交换 pipi 和 pjpj 的代价是|i-j|。要求使用最少的代价让p变成s。
收起
输入
单组测试数据。 第一行有一个整数n (1≤n≤200000),表示排列的长度。 第二行有n个范围是1到n的整数,表示排列p。每个整数只出现一次。 第三行有n个范围是1到n的整数,表示排列s。每个整数只出现一次。
输出
输出一个整数,表示从排列p变到s最少要多少代价。
输入样例
样例输入1 4 4 2 1 3 3 2 4 1
输出样例
样例输出1 3
我刚开始模拟数据模拟错了,所以提醒一下,他的代价是i-j的绝对值,也就是如果两个位置相同的交换那么不花费任何能量,而我也没有想到什么好的方法,只能模拟,我用a数组存储最开始的位置,然后b数组存储应该到的位置,然后每个位置都换一下,看一下需要多少代价。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<queue>
#include<string>
#include<iostream>
#include<vector>
using namespace std;
int a[200100];
int b[200100];
int main()
{
long long n,m,sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&m);
a[m]=i;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&m);
b[m]=i;
}
for(int i=1;i<=n;i++)
{
sum+=abs(b[i]-a[i]);
}
printf("%lld\n",sum/2);
return 0;
}