题目的意思是有一列数只由1,2,3组成~~~需要咱们将1放在一起排在最前面~~~2放在一起排在中间~~~3放在一起放后面~~问对于这个数列最少要进行多少次交换...
我的方法是先统计1,2,3的个数~~那么就可以知道1,2,3分辨该放在哪个区域~~
首先将1都放到该放的位置~~其所需步数就是找2~3的区域中1的个数~~然后再看1这个区域里有多少个2可以直接和2区域的交换~~有多少个3可以直接和3区域的交换~~~做完后这是1已经放好了~~而且1中的2都尽量的往2区域放~~1中的3也在尽量的往3区域放~~那么这是2,3区域里面已经没有1了~~~并且显然的是2区域里的3=3区域里的2~~所以任意统计一个区域~~就找到2,3区域相互需要交换的次数了~~两次之和既是答案~~
冥冥之中感觉没必要用这种可以说是纯模拟的方法~~~想推一个更快捷的~~可一直错误~~
/*
ID: zzyzzy12
LANG: C++
TASK: sort3
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
int a[1002],g[4],i,ans,n,j;
int main()
{
freopen("sort3.in","r",stdin);
freopen("sort3.out","w",stdout);
scanf("%d",&n);
memset(g,0,sizeof(g));
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
g[a[i]]++;
}
for (i=1;i<=3;i++) g[i]+=g[i-1];
ans=0;
for (i=1;i<=g[1];i++)
if (a[i]!=1)
{
ans++;
if (a[i]==2)
{
for (j=g[1]+1;j<=g[2];j++)
if (a[j]==1) { a[j]=2; goto A;}
for (j=g[2]+1;j<=n;j++)
if (a[j]==1) { a[j]=2; goto A; }
}else
{
for (j=g[2]+1;j<=n;j++)
if (a[j]==1) { a[j]=3; goto A;}
for (j=g[1]+1;j<=g[2];j++)
if (a[j]==1) { a[j]=3; goto A; }
}
A: ;
}
for (i=g[2]+1;i<=n;i++)
if (a[i]==2) ans++;
printf("%d\n",ans);
return 0;
}