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);
    }
  • 相关阅读:
    网页打开速度的心理学
    UML建模——用例图(Use Case Diagram)
    漫谈干系人识别管理
    干系人分析的3个方法:除了目标用户还要考虑谁?
    计算机网络-复习笔记
    项目经理必掌握的国际项目管理知识体系结构及内容
    剑指Offer面试题:5.重建二叉树
    剑指Offer面试题:4.从尾到头打印链表
    剑指Offer面试题:3.替换空格
    剑指Offer面试题:2.二维数组中的查找
  • 原文地址:https://www.cnblogs.com/8023spz/p/8205456.html
Copyright © 2011-2022 走看看