【USACO 2.1.3】三值的排序

时间:2024-05-31 20:07:14

【题目描述】

排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种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 ;
}