2017-8-7
题目描述
给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数
解答
将结果与所给情况进行比较,相等不用处理,对应相反直接交换即可,否则进行处理
代码
/*
ID: 18795871
PROG: sort3
LANG: C++
*/
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
const int N = 1000;
ifstream fin("sort3.in");
ofstream fout("sort3.out");
int x[N+1],y[N+1];
bool f[N+1];
int cnt=0,n,x1,x2,x3;
void init(){
int i;
for (i=1;i<=x1;i++) y[i]=1;
for (i=x1+1;i<=x1+x2;i++) y[i]=2;
for (i=x1+x2+1;i<=x1+x2+x3;i++) y[i]=3;
}
void cal(){
int i,j;
int ss=0;
for (i=1;i<=n;i++){
if (x[i]==y[i]) f[i]=true;
}
for (i=1;i<=n;i++){
if (!f[i]){
for (j=i+1;j<=n;j++){
if (!f[j]&&x[i]==y[j]&&x[j]==y[i]){ //对应相反直接交换
cnt++;
f[i]=true;
f[j]=true;
break;
}
}
}
}
int s=0;
for (i=1;i<=n;i++){
if (!f[i]) s++;
}
if (s!=0) fout<<s/3*2+cnt<<endl;
else fout<<cnt<<endl;
}
int main()
{
fin>>n;
x1=0,x2=0,x3=0;
for (int i=1;i<=n;i++){
fin>>x[i];
if (x[i]==1) x1++;
else if (x[i]==2) x2++;
else x3++;
}
init();
cal();
return 0;
}