题目:http://codeforces.com/contest/584/problem/E

题意:有两个数组p,s,长度为n,且是1~n的排列。要使数组p变为s,每交换 i 和 j 两个位子上的数,花费为 | i - j | (i和j表示的是位子的编号,而不是该位子上的数的值),求最小花费,并输出交换的步骤。

思路:先将s映射成1~n的顺序排列,,即 pos[ s[ i ] ] = i,再将p根据同一映射函数映射成新的序列(详见代码)

对于那些不在自己位子上(即需要交换)的数,从小到大去选数移动,直到移到其该到的位子为止。想一下会发现,假设现移动当前最小数a,现在所在的位置是b,应该去到最小位置a,该数a必定是需要去往左交换的,而b左侧必定至少有一个数c是需要交换到>=b的位置的(若拿其他数x往右交换到位置b,可能会超过其应该去的位置x,而之后还需要将x往左交换回去,会出现重复的花费),那么就拿a和c交换,a往左边的目的地a位置靠,c往右边的目的地c位置靠,对于两者来说都是在走前往目的地的单程路径,并没有走重复的路。第一次交换后,若a仍没到位置a,那么接下去的情况都和前面情况的解决方法是相同的,继续找目的地位置在a当前位置now右侧的点进行交换,直至a交换到位置a为止,其他的点也是。会发现,那样的话,每个点最终交换到目的地的过程中都没有走重复的路径, (乘1/2是因为交换一次的cost,对两个点分别都产生了效果cost,总的产生了2*cost,即  ,其中  )

交换步骤的输出,结合上面的分析就可以写出来了(详见代码)

#include <iostream>
#include <cstdio>
#include <iomanip>
#include <functional>
#include <algorithm>
#include <bitset>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <cstddef>
#include <memory>
#include <vector>
#include <cctype>
#include <string>
#include <cmath>
#include <queue>
#include <deque>
#include <list>
#include <ctime>
#include <stack>
#include <sstream>
#include <map>
#include <set>
//#include <unordered_map>
//#include <unordered_set>
//#pragma GCC optimize(3)
//#pragma GCC optimize("unroll-loops")
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pb push_back
#define mkp(a,b) make_pair(a,b)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define fi first
#define se second
#define lc (d<<1) //d*2
#define rc (d<<1|1) //d*2+1
#define eps 1e-9
#define dbg(x) cerr << #x << " = " << x << "\n";
#define mst(a,val) memset(a,val,sizeof(a))
#define stn(a) setprecision(a)//小数总有效位数
#define stfl setiosflags(ios::fixed)//点后位数:cout<<stfl<<stn(a);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double PI=3.1415926535897932;
const int MAXN=1e5+10;
const ll mod=1e9+7;
ll inline mpow(ll a,ll b){ll ans=1;a%=mod;while(b){if(b&1)ans=(ans*a)%mod;a=(a*a)%mod,b>>=1;}return ans;}
int inline sgn(double x){return (x>-eps)-(x<eps);} //a<b:sgn(a-b)<0
priority_queue<int,vector<int>,greater<int> > qu; //up
priority_queue<int,vector<int>,less<int> > qd; //dn
const int inf = 0x3f3f3f3f; //9
const ll inff = 0x3f3f3f3f3f3f3f3f; //18int n;
int p[2010],s[2010];
int pos[2010];
int ans;
vector<PII>vec;int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&p[i]);for(int i=1;i<=n;i++) {scanf("%d",&s[i]);pos[s[i]]=i;}for(int i=1;i<=n;i++) p[i]=pos[p[i]];for(int i=1;i<=n;i++) ans+=abs(i-p[i]);ans/=2;for(int i=1;i<=n;i++){int now;for(int j=1;j<=n;j++)if(p[j]==i) now=j;if(now!=i)for(int j=now;j>=i;j--)if(p[j]>=now){swap(p[now],p[j]);vec.pb(mkp(now,j));now=j;}}printf("%d\n",ans);printf("%d\n",vec.size());for(int i=0;i<vec.size();i++)printf("%d %d\n",vec[i].fi,vec[i].se);
}

codeforces 584 E. Anton and Ira(贪心,数组p经变换到数组s)相关推荐

  1. 51nod 1574 || Codeforces 584 E. Anton and Ira 思维+构造+贪心

    传送门:E. Anton and Ira 题意:给定两个1-n的全排列p和s,假设交换pi和pj的代价是abs(i-j),问怎样将p交换成s才能使代价最小. 思路:先将s映射成1-n的顺序排列,再将p ...

  2. codeforces#324(div2) E. Anton and Ira 贪心

    codeforces#324(div2) E. Anton and Ira  贪心 E. Anton and Ira time limit per test 1 second memory limit ...

  3. Codeforces Round #324 (Div. 2) E. Anton and Ira 贪心

    E. Anton and Ira Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/584/probl ...

  4. codeforces 324# E. Anton and Ira (暴力枚举+贪心)

    题目:http://codeforces.com/contest/584/problem/E 题意:给定两个排列p1和p2.可以交换p1中的两个元素p1[i],p1[j],花费为|i-j|,求最小的话 ...

  5. Codeforces 584E. Anton and Ira (排列好题)

    大致题意: n <= 2000,有一1-n的排列p和s,对pi和pj交换产生的代价是 | i - j | , 问最少需要多少代价使,排列p变成排列s,输出解 思路: 可以先把s映射成1...n的 ...

  6. 【CodeForces Round #550】A-F | 模拟 | 贪心 | 高精 | BFS | 二分图 | E

    今年怎么没有愚人节比赛了   CF你看看人家洛谷   唉鸭原来那边还没到愚人节呢- 愚人节比赛还是有的,在今晚 qwq [CodeForces 1144   A-F] Tags:模拟 贪心 BFS 高 ...

  7. Codeforces 785 D.Anton and School - 2(组合数处理)

    Codeforces 785 D.Anton and School - 2 题目大意:从一串由"(",")"组成的字符串中,找出有多少个子序列满足:序列长度为偶 ...

  8. Codeforces 437C The Child and Toy(贪心)

    题目连接:Codeforces 437C  The Child and Toy 贪心,每条绳子都是须要割断的,那就先割断最大值相应的那部分周围的绳子. #include <iostream> ...

  9. codeforces#320(div2) D Or Game 贪心

    codeforces#320(div2) D  "Or" Game  贪心 D. "Or" Game time limit per test 2 seconds ...

最新文章

  1. 《3+1团队》【Alpha】Scrum meeting 4
  2. 【Xamarin挖墙脚系列:使用Xamarin进行Hybrid应用开发】
  3. 前端知识区别和学习路线_个人收藏
  4. 后端:Java中的BigDecimal类你了解多少?
  5. python中getopt函数_Python中getopt()函数的使用
  6. jdk16新特性_jdk8到jdk16新特性
  7. Meshing Tutorials(网格划分教程)
  8. c++语言 幂指数,C / C++幂函数,计算给定数字的幂
  9. Java面试题(一)
  10. pandas计算年化收益波动率
  11. 三阶齐次线性方程求通解_三阶常系数线性微分方程特解的简单求法
  12. html 取消settimeout,JavaScript中停止执行setInterval和setTimeout事件的方法
  13. 浅析搭建高速公路视频监控平台的建设方案及必要性
  14. TCP/IP 面试题整理
  15. join()方法的使用
  16. Python实现AI图像识别-身份证识别
  17. 10个明亮的圣诞照片滤镜LR预设模板 10 Bright Christmas Desktop Mobile presets
  18. 【原创】python爬虫 某二手汽车网站 python+mysql
  19. 【JAVA】JAVA关键字
  20. XDOJ 1-1 车牌限行

热门文章

  1. python手机小游戏刷分器_如何用5行Python代码写出刷分游戏脚本!Python真牛!
  2. 《Linux/UNIX OpenLDAP实战指南》——2.6 OpenLDAP目录树规划
  3. html绘制word柱状图,如何在word绘制插入柱形图_excel中如何插入柱形图 - 学无忧
  4. nginx+fastcgi+flask延时分段返回数据
  5. 初识WorldWind——WorldWind编译生成,解决乱码等问题
  6. 计算机网络优化复习题目——选择、判断(仅供参考)
  7. Craster's Parabolic Projection(CPP)
  8. 操作系统中PV操作实现进程同步与互斥问题(以苹果橘子问题为例)
  9. C# 文件的压缩与解压缩
  10. iis提示“另一个程序正在使用此文件,进程无法访问。(异常来自HRESULT:0x80070020) ”