PAT 1067 Sort with Swap(0, i)
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 (≤) 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
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int main(){ 5 int n, i, cnt=0, sp=0; 6 vector<int> v(100000), idx(100000); 7 scanf("%d", &n); 8 for(i=0; i<n; i++){ 9 scanf("%d", &v[i]); 10 idx[v[i]] = i; 11 if(i==idx[i]) cnt++; 12 } 13 int begin=0; 14 while(cnt<n){ 15 if(idx[0]!=0){ 16 swap(v[idx[0]], v[idx[idx[0]]]); 17 swap(idx[0], idx[idx[0]]); 18 cnt++; 19 }else{ 20 while(v[begin]==begin) begin++; 21 swap(idx[0], idx[v[begin]]); // 先交换序号再交换值 22 swap(v[0], v[begin]); 23 } 24 sp++; 25 } 26 cout<<sp<<endl;; 27 return 0; 28 }
有疑惑或者更好的解决方法的朋友,可以联系我,大家一起探讨。qq:1546431565