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

来源:互联网 发布:非凡网络加速器下载 编辑:程序博客网 时间:2024/06/04 01:09

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 <vector>using namespace std;int main(){int n;cin>>n;vector<int> pos(n);for(int i=0;i<n;i++){int t;cin>>t;pos[t] = i;}int cnt = 0;for(int i=0;i<n;i++){while(pos[0] != 0){int t = pos[0];pos[0] = pos[t];pos[t] = t;cnt++;}if(pos[i] != i){pos[0] = pos[i];pos[i] = 0;cnt++;}}cout<<cnt<<endl;return 0;}


0 0
原创粉丝点击