点击链接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;
}