51nod1574 排列转换

题意:输入两个序列,每次可以交换两个数,费用为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\n", ans>>1);
    return 0;
}

 

posted on 2017-12-02 19:53  2855669158  阅读(112)  评论(0编辑  收藏  举报

导航