当前位置: 代码迷 >> 综合 >> PAT甲级-1067 Sort with Swap(0, i) (25分)
  详细解决方案

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

热度:86   发布时间:2023-09-26 22:57:39.0

点击链接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,算出来最小的交换次数显然是不对的,如图PAT甲级-1067 Sort with Swap(0, i) (25分)
后来直接基于这个代码改的,比较臃肿

我的思路:
交换次数先为错误数字的个数,如果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;
}
  相关解决方案