1067. Sort with Swap(0,*) (25)【贪心】——PAT (Advanced Level) Practise

题目信息

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

时间限制150 ms
内存限制65536 kB
代码长度限制16000 B

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 (<=10^5) 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。与该数应处的位置交换

AC代码

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> a, b;
int main()
{
    int n, t, c = 0;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i){
        scanf("%d", &t);
        a.push_back(t);
    }
    int cnt = 0;
    while (c < n){ //序列排序未结束
        if (0 == a[0]){ //首位为0,找出第一个未排序的数的位置
            for (; c < n && c == a[c]; ++c)
                continue;
            if (c >= n) break;
            swap(a[0], a[c]);
            ++cnt;
        }else{ //首位非0。与应处于的位置交换
            swap(a[0], a[a[0]]);
            ++cnt;
        }
    }
    printf("%d
", cnt);
    return 0;
}

个人游戏推广:
《10云方》与方块来次消除大战!

原文地址:https://www.cnblogs.com/jhcelue/p/7074055.html