zoukankan      html  css  js  c++  java
  • Pat1067:Sort with Swap(0,*)

    1067. Sort with Swap(0,*) (25)

    时间限制
    150 ms
    内存限制
    65536 kB
    代码长度限制
    16000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    Given any permutation of the numbers {0, 1, 2,..., N-1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the following way:

    Swap(0, 1) => {4, 1, 2, 0, 3}
    Swap(0, 3) => {4, 1, 2, 3, 0}
    Swap(0, 4) => {0, 1, 2, 3, 4}

    Now you are asked to find the minimum number of swaps need to sort the given permutation of the first N nonnegative integers.

    Input Specification:

    Each input file contains one test case, which gives a positive N (<=105) followed by a permutation sequence of {0, 1, ..., N-1}. All the numbers in a line are separated by a space.

    Output Specification:

    For each case, simply print in a line the minimum number of swaps need to sort the given permutation.

    Sample Input:
    10 3 5 7 2 6 4 9 0 8 1
    
    Sample Output:
    9

    思路
    贪心 + 桶排序。

    1.用数组pos模拟N个桶记录输入的数的位置,数组的下标表示这个数。输入数字时根据输入次序i和数字大小num是否相等来决定需要和0交换的数字个数NumCount。
    2.只要0没有在0位置,就将pos[0]与pos[pos[0]]交换.循环直到pos[0] == 0。
    3.如果pos[0] == 0且还有数字不在正确的位置(NumCount > 0),那么就将0和最近的一个不在正确位置的数字交换。注意索引交换的数字时用index记录下标(不然有几个测试用例会超时),这样下一次pos[0] == 0需要索引新的交换数字时不用再重头开始。
    4.用一个变量swaptimes统计交换次数,然后输出就行。

    代码
    #include<iostream>
    #include<vector>
    using namespace std;
    int main()
    {
        int N;
        while(cin >> N)
        {
            int index = 1,NumCount = 0,swaptimes = 0;
            vector<int> pos(N);
            for(int i = 0;i < N;i++)
            {
                int num;
                cin >> num;
                pos[num] = i;
                if(pos[num] != num && num != 0)
                    NumCount++;
            }
            while(NumCount > 0)
            {
                if(pos[0] == 0)
                {
                    while(index < N)
                    {
                        if(pos[index] != index)
                        {
                            swap(pos[0],pos[index]);
                            swaptimes++;
                            break;
                        }
                        index++;
                    }
                }
                while(pos[0] != 0)
                {
                    swap(pos[0],pos[pos[0]]);
                    NumCount--;
                    swaptimes++;
                }
            }
            cout << swaptimes << endl;
        }
    }
    
    
    

      

     
  • 相关阅读:
    php数组转换成js可用的数组的两种方式
    常用正则表达式--------------[拿把小刀,强大自己]
    AngularJs 相应回车事件
    常见的关系型数据库和非关系型数据库及其区别
    CMDB资产采集
    GB和GiB的区别
    python枚举详解
    python保留两位小数
    详解TCP三握四挥
    npm run dev 和 npm run serve
  • 原文地址:https://www.cnblogs.com/0kk470/p/7777192.html
Copyright © 2011-2022 走看看