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

来源:互联网 发布:婚纱照软件哪个好 编辑:程序博客网 时间:2024/06/06 12:56

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

对一个序列排序,每次的操作只能是一个非零的数与零交换位置。同时维护 索引->值 和 值->索引 两个数组。如果索引为0处值为0,有两种情况:一是已经排序好了,这样就可以退出循环,二是还没有排序好,就选第一个还没到位的数与零进行交换。如果索引为0处的值不为0,也即零的索引值不为0,则将零与零的索引值交换(即将零的索引值“送“到合适的位置,使该值等于该值的索引值),同时也要更新索引值数组。


代码:

#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <vector>using namespace std;int main(){int n;scanf("%d",&n);vector<int>a(n);vector<int>idx(n);for(int i=0;i<n;i++){scanf("%d",&a[i]);idx[a[i]]=i;}int count=0,i=1;while(true){if(a[0]==0){for(i;i<n;i++){if(a[i]!=i){break;}}if(i==n) break;else{swap(a[0],a[i]);swap(idx[a[0]],idx[a[i]]);count++;}}else{swap(a[idx[idx[0]]],a[idx[0]]);swap(idx[idx[0]],idx[0]);count++;}}printf("%d\n",count);}


0 0
原创粉丝点击