51nod 1574 排列转换(贪心+鸽巢原理)

来源:互联网 发布:12本程序员必读的书籍 编辑:程序博客网 时间:2024/05/18 20:47

题意:有两个长度为n的排列p和s。要求通过交换使得p变成s。交换 pi 和 pj 的代价是|i-j|。要求使用最少的代价让p变成s。

考虑两个数字pi和pj,假如交换他们能使得pi到目标的距离减少,pj到目标的距离减少。那么应该交换他们,这是一个必要的操作,也是答案的下界。

如果每一次都能找到这样的两个数字,那么答案就是排列p中的每个数字在排列s的位置的距离差之和/2.这显然是答案的下界。

现在考虑证明这个下界是可以构造出来的。

考虑排列p中最后一个位置不对的数字,不妨设为pj,他的目标位置是pi,那么如果p[i+1,j]中有任意一个数的目标是pk(k

#include<bits/stdc++.h>using namespace std;const int maxn = 2e5+5;typedef long long ll;int pos[maxn];int main(){    int n;    while(~scanf("%d",&n))    {        int x;        for(int i = 1;i <= n;++i)        {            scanf("%d",&x);            pos[x] = i;        }        ll ans = 0;        for(int i = 1;i <= n;++i)        {            scanf("%d",&x);            ans += abs(pos[x] - i);        }        printf("%lld\n",ans/2);    }    return 0;}