• 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 }
    
    
    
    
    
  • 相关阅读:
    JAVA设计模式---总述篇
    Java中对象创建时的内存分配
    for循环打印空心菱形的新方法
    springcloud2.X通过actuator加载配置无效问题
    golang-错误处理
    golang-字符串
    golang-方法和接口
    golang-结构体与指针
    golang-数组、切片、映射
    golang-流程控制
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/8715615.html
Copyright © 2020-2023  润新知