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);
}
原文地址:https://www.cnblogs.com/8023spz/p/8205456.html