求最小排序交换次数
贪心做
View Code
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int b[1009],a[1009];
int min(int a,int b)
{
if(a>b)return b;
else return a;
}
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
int main()
{
int n;
int add[6];
while(scanf("%d",&n)!=EOF)
{
memset(add,0,sizeof(add));
int i;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(&a[0],&a[n]);
int all=0;
for(i=0;i<n;i++)
{
if(a[i]==1&&b[i]==2)
add[0]++;
else if(a[i]==2&&b[i]==1)
add[1]++;
else if(a[i]==2&&b[i]==3)
add[2]++;
else if(a[i]==3&&b[i]==2)
add[3]++;
else if(a[i]==1&&b[i]==3)
add[4]++;
else if(a[i]==3&&b[i]==1)
add[5]++;
}
all=min(add[0],add[1])+min(add[2],add[3])+min(add[4],add[5]);
all+=(max(add[0],add[1])-min(add[0],add[1])+max(add[2],add[3])-min(add[2],add[3])+max(add[4],add[5])-min(add[4],add[5]))/3*2;
printf("%d\n",all);
}
}