最少交换次数
2015-09-21 21:25
316 查看
给定一个序列,通过交换元素使序列变为有序,求最小交换次数?
1、每次只能交换相邻的元素:逆序数
代码:略
2、每次可以交换任意两个元素
贪心+二分
代码:(要求序列中没有重复的元素)
1、每次只能交换相邻的元素:逆序数
代码:略
2、每次可以交换任意两个元素
贪心+二分
代码:(要求序列中没有重复的元素)
#include <cstdio> #include <cstring> #include <algorithm> #define MAXN 1000010 using namespace std; int n,d[MAXN]; int t[MAXN],right_flag[MAXN]; long long ct; int binary_search(int v,int l,int r){ while(l<=r){ int mid=(l+r)>>1; if(mid>=n) return mid; if(t[mid]>v) r=mid-1; else if(t[mid]==v) {if(!right_flag[mid]) return mid;else return n;} else if(t[mid]<v) l=mid+1; } } int getmin(){ mempcpy(t,d,n*sizeof(int)); sort(t,t+n); for(int i=0;i<n;++i) right_flag[i]=(t[i]==d[i]); int ans=0,p=0; ct=0; while(1){ while(p<n&&right_flag[p])p++; if(p>=n) break; int q=binary_search(d[p],p+1,n); // int q=p+1; //for(;q<n;++q) {if(t[q]==d[p]&&!right_flag[q]) break;}///枚举法 if(q>=n) break; right_flag[q]=true; if(d[q]==t[p]) right_flag[p]=true; swap(d[p],d[q]); ans++; } return ans; } int main(){ while(scanf("%d",&n)==1){ for(int i=0;i<n;++i) scanf("%d",&d[i]); printf("%d\n",getmin()); } return 0; }
相关文章推荐
- 自己的练习
- hdu5459 Jesus Is Here
- 大数据量高效导入数据库(以excel导入sqlserver为例)
- javascript鼠标经过背景色和字体颜色改变
- Shell 调试
- 航班预订系统需求说明书-登录模块1.0
- 简易新浪微博客户端--Sweetheart
- 使用Zxing实现Android二维码扫描
- hadoop windows
- 无根树转有根树代码
- 数据库之视图浅析
- 巨杉数据库创始人兼CTO王涛:SequoiaDB为何要开源?
- 下面哪些函数调用必须进入内核才能完成?
- FPGA图案--数字表示(代码+波形)
- [leetcode 27]Implement strStr()
- FTP原理
- UNIX环境编程学习笔记(16)——进程管理之进程环境变量 http://www.cnblogs.com/lienhua34/p/4005367.html
- hdu5452(2015沈阳网络赛C题)
- 货币求和
- firefox设置代理服务器时怎样设置才能使得访问局域网时不使用代理