题意:输入两个序列,每次可以交换两个数,费用为abs(pos1-pos2)问从第一个序列到第二个序列的花费最少多少
题解:一个经典的问题,首先可以把问题简化为第一个序列到1,2,3,4.。。。n的花费,选两个数,两个数交换的条件是两者交换后两者更靠近自己最终的位置,而且这两个数必定存在(这里不考虑序列前后相同的数),所以最后答案就是sum{abs(a[i]-i)}/2
#include <bits/stdc++.h> #define maxn 201000 #define INF 0x3f3f3f3f typedef long long ll; using namespace std; ll n, a[maxn], dir[maxn], ans, t; int main(){ scanf("%lld", &n); for(ll i=1;i<=n;i++) scanf("%lld", &a[i]),dir[a[i]] = i; for(ll i=1;i<=n;i++) scanf("%lld", &t),a[dir[t]] = i; for(ll i=1;i<=n;i++) ans += abs(a[i]-i); printf("%lld ", ans>>1); return 0; }