排序是一种很频繁的计算任务。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。
写一个程序计算出,计算出的一个包括1、2、3三种值的数字序列,排成升序所需的最少交换次数。
输入第1行为类别的数量N(1≤N≤1000)
输入第2行到第N+1行,每行包括一个数字(1或2或3)。
输出包含一行,为排成升序所需的最少交换次数。
样例1
输入:
9 2 2 1 3 3 3 2 3 1
输出:
4
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
int *a = new int[n];
int i, c1 = 0, c2 = 0;
for(i = 0; i < n; ++i){
cin >> a[i];
if(a[i] == 1){
++c1;
}else if(a[i] == 2){
++c2;
}
}
int c12 = 0, c13 = 0, c21 = 0, c23 = 0, c31 = 0, c32 = 0;
for(i = 0; i < c1; ++i){
if(a[i] == 2){
++c12;
}else if(a[i] == 3){
++c13;
}
}
for(i = c1; i < c1 + c2; ++i){
if(a[i] == 1){
++c21;
}else if(a[i] == 3){
++c23;
}
}
for(i = c1 + c2; i < n; ++i){
if(a[i] == 1){
++c31;
}else if(a[i] == 2){
++c32;
}
}
int res = min(c12, c21) + min(c13, c31) + min(c23, c32);
c12 -= c21;
if(c12 < 0){
c12 = -c12;
}
res += c12 * 2;
cout << res << endl;
}