您的位置:首页 > 其它

pat--Sort with Swap(0, i)

2016-07-26 11:27 225 查看
/**********
https://pta.patest.cn/pta/test/1317/exam/4/question/18076
Given any permutation of the numbers {0, 1, 2,..., N-1N−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 NN nonnegative
integers.


Input Specification:

Each input file contains one test case, which gives a positive NN (\le
10^5≤10​5​​)
followed by a permutation sequence of {0, 1, ..., N-1N−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:

103 5 7 2 6 4 9 0 8 1


Sample Output:

9
**********/

#include<iostream>
#include<stdio.h>
using namespace std;
int mark[100005];
int main()
{
int N,k=0,A[100005];
cin>>N;
for(int i=0; i<N; i++)
{
scanf("%d",&A[i]);
if(A[i]==i)
k++;
}
int sum=0;
for(int i=0; i<N; i++)
{
int j=i;
if(!mark[i]&&j!=A[j])
{
sum=sum+1;
while(j!=A[j]&&!mark[j])
{
mark[j]=1;
j=A[j];
}
}
}
int num=0;
if(A[0]==0)
{
num=(N-k)+sum;
}
else
{
num=(N-k)-1+(sum-1);
}
cout<<num<<endl;
return 0;
}


<ul><li><span style="font-family:Arial, Helvetica, sans-serif;"><span style="white-space: normal;">
</span></span></li></ul>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: