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

PAT 1067 Sort with Swap(0, i)

时间:2018-09-02 20:26:27      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:OWIN   sim   mes   file   fir   mat   rate   find   tput   

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 (≤) 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 int main(){
 5   int n, i, cnt=0, sp=0;
 6   vector<int> v(100000), idx(100000);
 7   scanf("%d", &n);
 8   for(i=0; i<n; i++){
 9     scanf("%d", &v[i]);
10     idx[v[i]] = i;
11     if(i==idx[i]) cnt++;
12   }
13   int begin=0;
14   while(cnt<n){
15     if(idx[0]!=0){
16       swap(v[idx[0]], v[idx[idx[0]]]);
17       swap(idx[0], idx[idx[0]]);
18       cnt++;
19     }else{
20       while(v[begin]==begin) begin++;
21       swap(idx[0], idx[v[begin]]); // 先交换序号再交换值
22       swap(v[0], v[begin]);
23     }
24       sp++;
25   }
26   cout<<sp<<endl;;
27   return 0;
28 }

 

PAT 1067 Sort with Swap(0, i)

标签:OWIN   sim   mes   file   fir   mat   rate   find   tput   

原文地址:https://www.cnblogs.com/mr-stn/p/9574631.html

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