zoukankan      html  css  js  c++  java
  • Sorting a Three-Valued Sequence(三值排序)

    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出现的次数,分成1,2,和3的区间。贪心策略,每一次交换尽可能的使交换得到的数分配到
    应该到的区域,这样才能得到最少交换次数。

    上代码:
     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<algorithm>
     4 using namespace std;
     5 int main()
     6 {
     7     int n,i,j,count1=0,count2=0,count3=0,count=0;
     8     int  a[10001];
     9     scanf("%d",&n);
    10     for(i=0; i<n; i++)
    11     {
    12         scanf("%d",&a[i]);
    13         if(a[i]==1)///分别统计1,2,3出现的次数,来划分区间
    14             count1++;
    15         if(a[i]==2)
    16             count2++;
    17         if(a[i]==3)
    18             count3++;
    19     }
    20     for(i=0;i<count1;i++)
    21     {
    22         if(a[i]==2)
    23         {
    24             for(j=count1;j<n;j++)
    25             {
    26                 if(a[j]==1)
    27                     {
    28                         swap(a[i],a[j]);
    29                     count++;
    30                     break;
    31                     }
    32             }
    33         }
    34         if(a[i]==3)
    35         {
    36             for(j=n-1;j>=count1;j--)
    37             {
    38                 if(a[j]==1)
    39                 {
    40                     swap(a[i],a[j]);
    41                     count++;
    42                     break;
    43                 }
    44             }
    45         }
    46     }///1的区间里面将全部换成1
    47     for(i=count1;i<count1+count2;i++)
    48     {
    49         if(a[i]==3)
    50         {
    51             for(j=count1+count2;j<n;j++)
    52             {
    53                 if(a[j]==2)
    54                 {
    55                     swap(a[i],a[j]);
    56                     count++;
    57                     break;
    58                 }
    59             }
    60         }
    61     }///2的区间里面将全部换成2,那么自然而然3的区间也都是3
    62     printf("%d
    ",count);
    63     return 0;
    64 }
    
    
    
    
    
  • 相关阅读:
    ecos之widget
    一个php小白找工作的历程
    php知识点总结(待续)
    2
    php笔试题1
    兄弟连面试宝典php
    第二十一章 消费者选择理论
    第二十章 收入不平等与贫困
    第十九章 收入与歧视
    第十八章 生产要素市场
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/8715615.html
Copyright © 2011-2022 走看看