贪心策略:记录1,2,3的个数,将数组划分为三个区域,再用二维数组记录每个区域中,不属于该区域元素的个数,接着分别调换1区域的2和2区域的1,其他数类似,调换完后,剩下不属于区间的数要经过两次才能到正确的位置,用结果加上剩余1区间的其他数的二倍
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1005;
int x1,x2,x3;
int a[N],b[4][N];
int main(){
int n;
cin >> n;
for(int i=0;i<n;i++){
cin >> a[i];
if(a[i]==1){
x1++;
}else if(a[i]==2){
x2++;
}else x3++;
}
for(int i=0;i<x1;i++) b[1][a[i]]++;
for(int i=x1;i<x1+x2;i++) b[2][a[i]]++;
for(int i=x1+x2;i<n;i++) b[3][a[i]]++;
long long re=0;
int c12 = min(b[1][2],b[2][1]);
re += c12;
b[1][2] -= c12;
b[2][1] -= c12;
int c13 = min(b[1][3],b[3][1]);
re += c13;
b[1][3] -= c13;
b[3][1] -= c13;
int c23 = min(b[2][3],b[3][2]);
re += c23;
b[2][3] -= c23;
b[3][2] -= c23;
re += 2*(b[1][2]+b[1][3]);
cout << re << endl;
return 0;
}
293

被折叠的 条评论
为什么被折叠?



