【题目描述】
排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。
写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。
【格式】
INPUT FORMAT:
(file sort3.in)
第一行:
奖牌个数N (1 <= N <= 1000)
第 2行到第N+1行:
每行一个数字,表示奖牌。共N行。(1..3)
OUTPUT FORMAT:
(file sort3.out)
共一行,一个数字。表示排成升序所需的最少交换次数。
【分析】
这个真的没有什么好讲的了。
分两种情况就行了,看程序吧。
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
const int maxn=+;
using namespace std;
int shu[maxn],Sort[maxn];
int num[][];//在i中的j数量
int main()
{
int lj=,ans=,n,i;//总共不同的个数
//文件操作
freopen("sort3.in","r",stdin);
freopen("sort3.out","w",stdout);
memset(num,,sizeof(num));
scanf("%d",&n);
for (i=;i<=n;i++)
{
scanf("%d",&shu[i]);
Sort[i]=shu[i];
}
sort(Sort+,Sort++n);//排序
for (i=;i<=n;i++)
{
if (Sort[i]!=shu[i])
{
num[Sort[i]][shu[i]]++;
lj++;
}
}
ans+=min(num[][],num[][]);lj-=min(num[][],num[][])*;
ans+=min(num[][],num[][]);lj-=min(num[][],num[][])*;
ans+=min(num[][],num[][]);lj-=min(num[][],num[][])*;
printf("%d",ans+(lj/)*);
return ;
}