zoukankan      html  css  js  c++  java
  • 1067. Sort with Swap(0,*) (25)

    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

    首先,如果0不在0位置,就不停把他换到当前位置值所在的位置,直到0回归0位置,如果还存在值与位置值不符合的点,肯定是成对存在的,不妨对0~n-1再扫一遍,拿题目样例来说,位置下标从0开始,最初是3572649081,0在7位置,那么就和7换一下,为3502649781,然后继续,直到变成0523649781,0回到0位置了,一共换了3步,排序还没结束,此时对1~n-1扫一遍,发现5的位置不对,0与5交换,为5023649781,此时换了4步了,继续刚才的操作终于变为0123456789,最后经过了9步变换。
    代码:
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int main()
    {
        int n,d,c = 0,b = 0;
        int s[100005];
        scanf("%d",&n);
        for(int i = 0;i < n;i ++)
        {
            scanf("%d",&d);
            s[d] = i;
        }
        while(s[0])
        {
            int p = s[0];
            s[0] = s[p];
            s[p] = p;
            c ++;
        }
        for(int i = 0;i < n;i ++)
        {
            if(s[i] != i)
            {
                c ++;
                d = s[i];
                s[i] = 0;
                s[0] = d;
                while(s[0])
                {
                    int p = s[0];
                    s[0] = s[p];
                    s[p] = p;
                    c ++;
                }
            }
        }
        printf("%d",c);
    }
  • 相关阅读:
    php代码覆盖率执行
    如何更好的理解(pageX,pageY,clientX,clientY,eventX,eventY,scrollX,scrollY,screenX,screenY,event.offsetX,event.offsetY,offsetLeft,style.left)
    那些曾经纠结的大小写敏感
    jQuery中的经典动画
    月末总结
    小议jQuery中的事件
    DOM操作在jQuery中的实用------文字提示和图片提示
    HTML之表单元素
    http cookie
    HTML常用字符
  • 原文地址:https://www.cnblogs.com/8023spz/p/8205456.html
Copyright © 2011-2022 走看看