题目
题目描述
排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种 1,2 和 3。我们用交换的方法把他排成升序的。写一个程序计算出,给定的一个 1,2,3 组成的数字序列,排成升序所需的最少交换次数。
输入描述
第一行:奖牌个数 N(1≤N≤1000)
第二行到第N+1行:每行一个数字,表示奖牌。共 N 行。(1…3)
输出描述
共一行,一个数字。表示排成升序所需的最少交换次数。
数学解析
题目提取
输入
sum1 | sum2 | sum3 | - |
---|---|---|---|
one1 | two1 | three1 | sum1 |
one2 | two2 | three2 | sum2 |
one3 | two3 | three3 | sum1 |
目的
sum1 | sum2 | sum3 | - |
---|---|---|---|
sum1 | 0 | 0 | sum1 |
0 | sum2 | 0 | sum2 |
0 | 0 | sum3 | sum1 |
操作
进行交换,且需保持横、纵sum1、sum2、sum3均不变
过程
若one2>two1
sum1 | sum2 | sum3 | - |
---|---|---|---|
one1 | 0 | 0 | sum1 |
0 | two2+two2 | three2+one2-two2 | sum2 |
0 | two3 | three3+one3 | sum1 |
得: sum=one2+one3+two3
若two1>one2
sum1 | sum2 | sum3 | - |
---|---|---|---|
one1 | 0 | 0 | sum1 |
0 | two2+two1 | three2+one2-two1 | sum2 |
0 | two3 | three3+one3 | sum1 |
得: sum=two1+one3+two3
c++源码
//三值的排序
#include<iostream>
using namespace std;
int main()
{
int i,N,*x,sum=0,sum1=0,sum2=0;
int one2=0,one3=0,two1=0,two3=0;
cin>>N;
x=new int[N];
for(i=0;i<N;i++)
{
cin>>x[i];
if(x[i]==1)
sum1++;
else if(x[i]==2)
sum2++;
}
for(i=0;i<sum1;i++)
if(x[i]==2)
one2++;
else if(x[i]==3)
one3++;
for(i=sum1;i<sum1+sum2;i++)
if(x[i]==1)
two1++;
else if(x[i]==3)
two3++;
sum=one3+two3+((one2>two1)?one2:two1);
cout<<sum<<endl;
return 0;
}