sort3.cpp
来自「dd牛的usaco源代码!对学习算法」· C++ 代码 · 共 66 行
CPP
66 行
/*
ID: dd.ener1
PROG: sort3
LANG: C++
*/
#include <cstdio>
using namespace std;
long N;
long* s;
long to[3][3];//to[x][y]表示应该是x的却成了y的个数
long left[3];
long res;
void input(){
freopen("sort3.in","r",stdin);
scanf("%d",&N);
s=new long[N];
for(long i=0;i<N;++i){
scanf("%d",s+i);
--s[i];
}
}
void solve_left(){
for(long i=0;i<3;++i)left[i]=0;
for(long i=0;i<N;++i)++left[s[i]];
}
void solve_to(){
for(long i=0;i<3;++i)
for(long j=0;j<3;++j)
to[i][j]=0;
for(long i=0;i<left[0];++i)++to[0][s[i]];
for(long i=left[0];i<left[0]+left[1];++i)++to[1][s[i]];
for(long i=left[0]+left[1];i<N;++i)++to[2][s[i]];
}
long min(long a,long b){
return a<b?a:b;
}
long min(long a,long b,long c,long d){
return min(min(a,b),min(c,d));
}
void solve(){
solve_left();
solve_to();
res=0;
for(long i=0;i<3;++i)
left[i]-=to[i][i];
for(long i=0;i<3;++i)
for(long j=i+1;j<3;++j){
long delta=min(left[i],left[j],to[i][j],to[j][i]);
res+=delta;
left[i]-=delta;
left[j]-=delta;
}
res+=left[0]*2;
}
void output(){
freopen("sort3.out","w",stdout);
printf("%d\n",res);
}
int main(){
input();
solve();
output();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?