您的位置:首页 > 其它

最少交换次数

2015-09-21 21:25 316 查看
给定一个序列,通过交换元素使序列变为有序,求最小交换次数?

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: