CF 584E(Anton and Ira-构造+贪心)
2015-10-13 13:17
295 查看
已知2个排列a,b,交换第i位位与第j位代价=abs(i-j) ,求把排列a变成排列b最小代价及任一合法方案
先把第一个排列变成顺序的
我们考虑对 ii 最终要移到bib_i ,代价=|i−bi||i-b_i|
最小总代价ans=12∑ni=1|i−bi|ans=\frac1 2 \sum_{i=1}^n|i-b_i|
不妨假设这是答案,
那么每个数只能往一个方向挪,
我们从n开始,不断找可以交换的数交换,显然可以挪到n。
递归做完即可
先把第一个排列变成顺序的
我们考虑对 ii 最终要移到bib_i ,代价=|i−bi||i-b_i|
最小总代价ans=12∑ni=1|i−bi|ans=\frac1 2 \sum_{i=1}^n|i-b_i|
不妨假设这是答案,
那么每个数只能往一个方向挪,
我们从n开始,不断找可以交换的数交换,显然可以挪到n。
递归做完即可
#include<bits/stdc++.h> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define ForkD(i,k,n) for(int i=n;i>=k;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define MEM(a) memset(a,0,sizeof(a)); #define pb push_back #define mp make_pair #define MAXN (2000+10) #define fi first #define se second typedef long long ll; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} int n; int a[MAXN],b[MAXN],h[MAXN]; vector<pair<int,int> > p; int main() { // freopen("CF584E.in","r",stdin); cin>>n; For(i,n) scanf("%d",&b[i]); For(i,n) scanf("%d",&a[i]); For(i,n) h[a[i]]=i; For(i,n) b[i]=h[b[i]]; For(i,n) h[b[i]]=i; int ans=0,k=0; ForD(i,n) { int pos=h[i]; Fork(j,pos+1,i) { if (b[j]<=pos) { p.pb(mp(j,pos)); ans+=abs(j-pos); swap(b[j],b[pos]); swap(h[b[j]],h[b[pos]]); pos=j; } } } int m=p.size(); cout<<ans<<endl<<m<<endl; Rep(i,m) printf("%d %d\n",p[i].fi,p[i].se); return 0; }
相关文章推荐
- 快速基于echarts的大数据可视化
- iOS--webView
- [LeetCode 292] Nim Game
- C语言:标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。行号不能有限制
- 关于软件开发的一些想法(log)
- PHP 模拟多进程
- 基于反射实现自动化restful开发
- WWDC 2015 - 揭开AutoLayout的神秘面纱(Mysteries Of Auto Layout) Part1
- 黑马程序员--java基础日记--网络编程
- html或者jsp页面引用jar包中的js文件
- C语言:编写程序求解:有1,2,3,4,个数字,将组成互不相同且无重复数字出现的三位数打印出来
- iOS 判断详细的网络类型
- 详解C#编程中.NET的弱事件模式
- 总结
- 创建C3P0数据源
- mysql 视图
- Lisp老程序编译时有时会出现编译出错,但程序没有任何错误,解决办法
- FMX 模态窗体
- 二级指针删除单向链表
- Provide Regular Time to Focus