PAT 1067 Sort with Swap(0, i)

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 }

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

时间: 2024-11-06 07:32:45

PAT 1067 Sort with Swap(0, i)的相关文章

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

1067. Sort with Swap(0,*) (25) 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 appl

PAT 1067 Sort with Swap(0,*)

#include <cstdio> #include <cstdlib> #include <vector> using namespace std; int swap(vector<int> &numpos, int va, int vb) { //printf("swap(%d at %d, %d at %d)\n", va, numpos[va], vb, numpos[vb]); int pa = numpos[va];

1067. Sort with Swap(0,*) (25)【贪心】——PAT (Advanced Level) Practise

题目信息 1067. Sort with Swap(0,*) (25) 时间限制150 ms 内存限制65536 kB 代码长度限制16000 B 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 exa

PAT 甲级 1067 Sort with Swap(0, i) (25 分)(贪心,思维题)*

1067 Sort with Swap(0, i) (25 分) 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 ap

1067 Sort with Swap(0, i) (25 分)

1067 Sort with Swap(0, i) (25 分) 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 ap

PAT Advanced 1067 Sort with Swap(0,*) (25) [贪?算法]

题目 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 f

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

时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue 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

PAT (Advanced Level) 1067. Sort with Swap(0,*) (25)

只对没有归位的数进行交换. 分两种情况: 如果0在最前面,那么随便拿一个没有归位的数和0交换位置. 如果0不在最前面,那么必然可以归位一个数字,将那个数字归位. 这样模拟一下即可. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include

PAT (Advanced Level) 1067 Sort with Swap(0, i)

题解   贪心.   若 0 的不在它的位置,那么 0 占的那个元素的位置,就和那个元素交换.   若 0 在它的位置,找一个没有归位的元素与 0 交换. 代码 #include<bits/stdc++.h> using namespace std; int arr[100005]; int main() { int i,n,x,cnt=0; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&am