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

Posted jhcelue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n", cnt);
    return 0;
}

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










以上是关于1067. Sort with Swap(0,*) (25)贪心——PAT (Advanced Level) Practise的主要内容,如果未能解决你的问题,请参考以下文章

PAT甲级——A1067 Sort with Swap(0, i)

PAT Advanced 1067 Sort with Swap(0,*) (25) [贪?算法]

PAT 甲级 1067 Sort with Swap(0, i) (25 分)(贪心,思维题)*

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

PAT (Advanced Level) 1067. Sort with Swap(0,*) (25)

1067 Sort with Swap(0, i) (25 分)难度: 中 / 知识点: 置换群