【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 104853
  • 排名 - 233

最新评论

阅读排行榜

评论排行榜

描述
排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。

写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。

格式

PROGRAM NAME: sort3

INPUT FORMAT:

(file sort3.in)

Line 1:N (1 <= N <= 1000)

Lines 2-N+1:每行一个数字,共N行。(1..3)

OUTPUT FORMAT:

(file sort3.out)

共一行,一个数字。表示排成升序所需的最少交换次数。

SAMPLE INPUT
9
2
2
1
3
3
3
2
3
1

SAMPLE OUTPUT
4

【参考程序】:

/*
ID: XIONGNA1
PROG: sort3
LANG: C++
*/
#include
<iostream>
using namespace std;
int a[1001];
int ans,n,l1,l2;
void Swap(int &x,int &y)
{
    
int t=x;x=y;y=t;
}
int main()
{
    freopen(
"sort3.in","r",stdin);
    freopen(
"sort3.out","w",stdout);
    scanf(
"%d",&n);
    l1
=l2=0;
    
for (int i=1;i<=n;i++)
    {
        scanf(
"%d",&a[i]);
        
if (a[i]==1) l1++;
        
else if (a[i]==2) l2++;
    }
    ans
=0;
    
for (int i=1;i<=l1;i++)
        
if (a[i]==3)
        {
            
for (int j=n;j>=l1+1;j--)
                
if (a[j]==1)
                {
                    Swap(a[i],a[j]);
                    ans
++break;
                }
        }
        
else if (a[i]==2)
        {
            
for (int j=l1+1;j<=n;j++)
                
if (a[j]==1)
                {
                    Swap(a[i],a[j]);
                    ans
++break;
                }
        }
    
for (int i=l1+1;i<=l1+l2;i++)
        
if (a[i]==3)
        {
            
for (int j=n;j>=l1+l2+1;j--)
                
if (a[j]==2)
                {
                    Swap(a[i],a[j]);
                    ans
++;break;
                }
        }
    printf(
"%d\n",ans);
    
return 0;
}
posted on 2009-07-17 11:03 开拓者 阅读(411) 评论(0)  编辑 收藏 引用 所属分类: USACO 题解

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理