码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-12-06 12:48:15      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:


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. }





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

标签:

原文地址:http://www.cnblogs.com/zzandliz/p/5023212.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!