Sorting a Three-Valued Sequence 三值的排序
Time Limit: 1 Sec Memory Limit: 64 MB
Description
排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候。 在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。 写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。
Input
Line 1: N (1 <= N <= 1000) Lines 2-N+1: 每行一个数字,共N行。(1..3)
Output
共一行,一个数字。表示排成升序所需的最少交换次数。
Sample Input
9 2 2 1 3 3 3 2 3 1
Sample Output
4
先记下1,2,3的个数,然后对区间内不满足条件的数进行交换,题目要求最少的步骤,所以要按规律来交换。
首先,先把交换一次两个数都满足条件的数交换,例如第一个区间里面有一个2,恰好第二个区间里面也有一个1,这样就可以交换这两个数,这样只交换了一次,但是有两个数满足了条件。
然后,再把交换一次只能满足一个数的换过来。
分为五个步骤吧
1 把第一区间里的2和第二区间里的1交换
2 把第一区间里的3和第三区间里的3交换
3 把第二区间里的3和第三区间里的2交换
4 把第一区间里不是1的与二三区间里的1交换
5 把第二区间里不是2的与第三区间里的2交换
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <deque>
#include <map>
#include <set>
using namespace std;
int main()
{
int n;
int s[1010];
int i,j,k;
int a=0,b=0,c=0;
int ans=0;
cin>>n;
for(i=1;i<=n;i++)
cin>>s[i];
for(i=1;i<=n;i++)
{
if(s[i]==1)
a++;
else if(s[i]==2)
b++;
else
c++;
}
for(i=1;i<=a;i++)
{
if(s[i]==3)
{
for(j=a+b+1;j<=n;j++)
if(s[j]==1)
{
ans++;
int t=s[i];
s[i]=s[j];
s[j]=t;
break;
}
}
}
for(i=1;i<=a;i++)
{
if(s[i]==2)
{
for(j=a+1;j<=a+b;j++)
if(s[j]==1)
{
ans++;
int t=s[i];
s[i]=s[j];
s[j]=t;
break;
}
}
}
for(i=a+1;i<=a+b;i++)
{
if(s[i]==3)
{
for(j=a+b+1;j<=n;j++)
if(s[j]==2)
{
ans++;
int t=s[i];
s[i]=s[j];
s[j]=t;
break;
}
}
}
for(i=1;i<=a;i++)
if(s[i]!=1)
for(j=a+1;j<=n;j++)
if(s[j]==1)
{
ans++;
int t=s[i];
s[i]=s[j];
s[j]=t;
break;
}
for(i=a+b+1;i<=n;i++)
if(s[i]==2)
for(j=a+1;j<=a+b;j++)
if(s[j]==3)
{
ans++;
int t=s[i];
s[i]=s[j];
s[j]=t;
break;
}
cout<<ans<<endl;
return 0;
}