1067. Sort with Swap(0,*) (25)


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

 

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. vector<int> num;
  5. int a[100010] = { 0 };
  6. int main(void) {
  7. int n;
  8. cin >> n;
  9. for (int i = 0; i < n; i++) {
  10. int temp;
  11. cin >> temp;
  12. num.push_back(temp);
  13. }
  14. int count = 0;
  15. for (int i = 0; i < n; i++) {
  16. if (num[i] != i)
  17. count++;
  18. else
  19. a[i]++;
  20. }
  21. if (num[0] == 0)
  22. count++;
  23. count--;
  24. a[0] = 1;
  25. int j = 0, p = 0;
  26. int check = 0;
  27. bool flag = false;
  28. for (int q = 0; q < n; q++)
  29. {
  30. while (a[j] == 1) {
  31. j = num[j];
  32. a[j] ++;
  33. }
  34. if (a[q] == 0) {
  35. j = q;
  36. a[j] = 1;
  37. count++;
  38. continue;
  39. }
  40. }
  41. cout << count ;
  42. return 0;
  43. }





posted @ 2015-12-06 11:25  白夜行zz  阅读(179)  评论(0)    收藏  举报