题目大意
给出一个由1、2、3组成的序列,任意两个数字可以交换,问至少交换几次使序列成为升序。
样例输入&输出
sample input
9 2 2 1 3 3 3 2 3 1
sample output
4
分析&反思
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n, tot[4], sum[4][4];
int list[1005];
int main() {
freopen("sort3.in", "r", stdin);
freopen("sort3.out", "w", stdout);
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> list[i];
tot[list[i]]++;
}
tot[2] += tot[1];
for(int i = 1; i <= n; i++) {
if(i <= tot[1]) {
sum[1][list[i]]++;
continue;
}
if(i <= tot[2]) {
sum[2][list[i]]++;
continue;
}
{
sum[3][list[i]]++;
}
}
int mins, ans = 0;
for(int i = 1; i <= 3; i++)
for(int j = 1; j < i; j++) {
mins = min(sum[i][j], sum[j][i]);
sum[i][j] -= mins;
sum[j][i] -= mins;
ans += mins;
}
ans += (sum[1][2] + sum[1][3]) * 2;
cout << ans << endl;
return 0;
}