三值排序——usaco

求最小排序交换次数
贪心做
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);
}
}

  

原文地址:https://www.cnblogs.com/huhuuu/p/2107159.html