PAT甲级-1067 Sort with Swap(0, i) (25分)

点击链接PAT甲级-AC全解汇总

题目:
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,算出来最小的交换次数显然是不对的,如图在这里插入图片描述
后来直接基于这个代码改的,比较臃肿

我的思路:
交换次数先为错误数字的个数,如果0的位置对了需要+1,0不对需要-1
此外,还需要加上连通区域数-1

我的AC代码:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int N,CNT=0;
    cin>>N;
    int address[N]={0};
    set<int>wrong_n;
    for(int i=0; i<N; i++)
    {
        int t;
        cin>>t;
        if(i==0)CNT=(t==0)?CNT+1:CNT-1;
        if(i!=t)
        {
            wrong_n.insert(t);
            address[t]=i;
        }
    }
    CNT+=wrong_n.size();
    while(wrong_n.size())
    {
        int start=*wrong_n.begin();
        wrong_n.erase(start);
        int next=address[start];
        do{
            wrong_n.erase(next);
            next=address[next];
        }while(next!=start);
        CNT++;
    }
    cout<<CNT-1;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34451909/article/details/107506414