描述
排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。
写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。
格式
PROGRAM NAME: sort3
INPUT FORMAT:
(file sort3.in)
Line 1:N (1 <= N <= 1000)
Lines 2-N+1:每行一个数字,共N行。(1..3)
OUTPUT FORMAT:
(file sort3.out)
共一行,一个数字。表示排成升序所需的最少交换次数。
SAMPLE INPUT
9
2
2
1
3
3
3
2
3
1
SAMPLE OUTPUT
4
【参考程序】:
/*
ID: XIONGNA1
PROG: sort3
LANG: C++
*/
#include<iostream>
using namespace std;
int a[1001];
int ans,n,l1,l2;
void Swap(int &x,int &y)
{
int t=x;x=y;y=t;
}
int main()
{
freopen("sort3.in","r",stdin);
freopen("sort3.out","w",stdout);
scanf("%d",&n);
l1=l2=0;
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if (a[i]==1) l1++;
else if (a[i]==2) l2++;
}
ans=0;
for (int i=1;i<=l1;i++)
if (a[i]==3)
{
for (int j=n;j>=l1+1;j--)
if (a[j]==1)
{
Swap(a[i],a[j]);
ans++; break;
}
}
else if (a[i]==2)
{
for (int j=l1+1;j<=n;j++)
if (a[j]==1)
{
Swap(a[i],a[j]);
ans++; break;
}
}
for (int i=l1+1;i<=l1+l2;i++)
if (a[i]==3)
{
for (int j=n;j>=l1+l2+1;j--)
if (a[j]==2)
{
Swap(a[i],a[j]);
ans++;break;
}
}
printf("%d\n",ans);
return 0;
}