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

来源:互联网 发布:php正则表达式语法 编辑:程序博客网 时间:2024/05/18 03:05



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
#include <iostream>#include <string>#include <cstring>#include <cstdio>#include <set>using namespace std;int num[100010], myIndex[100010], flag = 0;void mySwap(int num[], int a, int b) {int tmp = num[a];num[a] = num[b];num[b] = tmp;}void output(int num[], int n) {for (int i = 0; i < n; ++i){printf("%d ", num[i]);}printf("\n");}int main() {int n, cnt = 0, i;scanf("%d", &n);for(int i = 0; i < n; i++) {scanf("%d", &num[i]);myIndex[num[i]] = i;if(num[i] != i)flag += 1;}int first = 1;while(true) {int c1 = myIndex[0];if(c1 != 0) {int c2 = myIndex[c1];mySwap(num, c1, c2);myIndex[0] = c2;myIndex[c1] = c1;} else {for(i = first; i < n; i++) {if(num[i] != i) {myIndex[0] = i;myIndex[num[i]] = 0; mySwap(num, 0, i);first = i;break;}}if(i >= n) break;}cnt += 1;}printf("%d\n", cnt);return 0;}


0 0
原创粉丝点击