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
that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the following way:
Now you are asked to find the minimum number of swaps need to sort the given permutation of the first NN nonnegative
integers.
Each input file contains one test case, which gives a positive NN (\le
10^5≤105)
followed by a permutation sequence of {0, 1, ..., N-1N−1}.
All the numbers in a line are separated by a space.
For each case, simply print in a line the minimum number of swaps need to sort the given permutation.
9
**********/
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 (\le10^5≤105)
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>
相关文章推荐
- LintCode(easy)翻转字符串
- Generation and Comprehension of Unambiguous Object Descriptions
- Laravel5权限管理方法详解
- iOS 公用方法
- Java反射详解
- 如何取消codeblocks对msvcr100.dll的依赖?
- iOS编程(双语版) - 视图 - Transform(转换)
- MFC客户区拖动窗口实现
- SQLite中如何用api操作BLOB类型的字段
- Debug与Release版本区别
- ajax之ajax是什么???
- cocoapods的最新安装 遇到的坑 Error installing pods:activesupport requires Ruby version >= 2.2.2
- ajax常用操作及 跨域的实现原理
- Spring+quart
- python脚本编程:批量复制或删除文件
- Grub 配置文件详解
- 10.关联(Association)
- 转 Windows+VS2013爆详细Caffe编译安装教程
- git 提交代码到代码库 命令
- python 元组列表字典的区别