题目描述
排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候。
在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。
写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。
输入
从文件 sort3.in
中读入数据。
Line 1:N (1 <= N <= 1000)
Lines 2-N+1:每行一个数字,共N行。(1..3)
输出
输出到文件 sort3.out
中。
共一行,一个数字。表示排成升序所需的最少交换次数。
样例输入 复制
9 2 2 1 3 3 3 2 3 1
样例输出 复制
4
代码来了:
#include<bits/stdc++.h>
using namespace std;
int n,a[10001],b[10001],ans,l[10001],r[10001];
int main()
{
freopen("sort3.in","r",stdin);
freopen("sort3.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
b[i]=a[i];
sort(a,a+n+1);
for(int i=1;i<=n;i++)
{
if(a[i]!=b[i])
{
if(r[a[i]]>0&&l[b[i]]>0)
{
r[a[i]]--;
l[b[i]]--;
}
else
{
l[a[i]]++;
r[b[i]]++;
ans++;
}
}
}
cout<<ans;
}