51nod-1574-排列转换

题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
 收藏
 关注

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

Input
单组测试数据。
第一行有一个整数n (1≤n≤200000),表示排列的长度。
第二行有n个范围是1到n的整数,表示排列p。每个整数只出现一次。
第三行有n个范围是1到n的整数,表示排列s。每个整数只出现一次。
Output
输出一个整数,表示从排列p变到s最少要多少代价。
Input示例
样例输入1
4
4 2 1 3
3 2 4 1
Output示例
样例输出1
3

    具体的过程就是类似于蚂蚁爬行那种,但写起来很麻烦,没猜到结论就是当前位置到目标位置的差加起来/2这一步。。。
都是要把不在正确位置上的点移动到正确位置上,但可以借助交换减少一半的代价,,就酱紫
 1 #include<iostream>
 2 #include<cstring>
 3 #include<queue>
 4 #include<cstdio>
 5 #include<stack>
 6 #include<cmath>
 7 using namespace std;
 8 #define LL long long 
 9 int p[200020];
10 int s[200020];
11 int wz[200020];
12 struct node{
13     int fx,now,tar;
14 };
15 int main(){
16     int n,i,j,k;
17     cin>>n;
18     for(i=1;i<=n;++i){
19         scanf("%d",p+i);
20         wz[p[i]]=i;
21     }
22     long long  ss=0; 
23     for(i=1;i<=n;++i){
24         scanf("%d",s+i);
25         ss+=abs(i-wz[s[i]]);
26     }
27     cout<<ss/2<<endl;
28     return 0;
29 }
原文地址:https://www.cnblogs.com/zzqc/p/8942221.html