• 三值的排序 Sorting a Three-Valued Sequence


    题目描述

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

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

    输入输出格式

    输入格式:
    第一行:

    奖牌个数N (1 <= N <= 1000)

    第 2行到第N+1行:

    每行一个数字,表示奖牌。共N行。(1…3)

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

    输入输出样例

    输入样例#1:
    9
    2
    2
    1
    3
    3
    3
    2
    3
    1

    输出样例#1:
    4

    .
    .
    .
    .
    .
    .
    分析
    我们可以从题目中的一个条件入手:

    只有1,2和3

    既然如此,我们就知道将这个序列排序好后肯定是这么一个模式:1 1 1……2 2 2……3 3 3……

    那么根据这个模式,我们可以将序列分成三段,第一段保存1,第二段保存2,第三段保存3

    然后就先从第一段中找到2,与第二段中的1交换(如果有的话),在找到3,与第三段中的1交换(如果有的话),以此类推

    .
    .
    .
    .
    .
    程序:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,ans=0;
    int a[1005],s[4]={0};
    
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
    	{
    		scanf("%d",&a[i]);
            s[a[i]]++;
        } 
        int z=s[1]+1,y=n;
        for (int i=1;i<=s[1];i++)
    	{
            if (a[i]==2)
            {
                while (a[z]!=1) z++;
                int t=a[i];
    			a[i]=a[z];
    			a[z]=t;
                ans++;
            } else 
    		if (a[i]==3)
    		{
            	while (a[y]!=1) y--;
                int t=a[i];
    			a[i]=a[y];
    			a[y]=t;
                ans++;
            }
        }
        for (int i=s[1]+1;i<=s[1]+s[2];i++)
        	if (a[i]==3) ans++;
        printf("%d",ans); 
        return 0; 
    }
    
  • 相关阅读:
    Web网页安全色谱
    控件继承
    加密(转摘)
    关于Chart控件X轴数据显示不全解决方法。
    orcle 创建表空间用户
    oracle REGEXP_REPLACE
    產生64位隨机無重復碼
    简单跨浏览器通信.
    [原創]加載動態JS文件.
    层的拖放
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/10458926.html
Copyright © 2020-2023  润新知