点击链接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 (≤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的位置对了需要+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;
}