题意:
输入一个正整数N(<=100000),接着输入N个正整数(0~N-1的排列)。每次操作可以将0和另一个数的位置进行交换,输出最少操作次数使得排列为升序。
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int a[100007],b[100007]; 5 int main(){ 6 ios::sync_with_stdio(false); 7 cin.tie(NULL); 8 cout.tie(NULL); 9 int n; 10 cin>>n; 11 int ans=n-1; 12 for(int i=0;i<n;++i){ 13 cin>>a[i]; 14 b[a[i]]=i; 15 if(a[i]==i&&a[i]) 16 --ans; 17 } 18 int sum=0; 19 int pos=1; 20 while(ans) 21 if(b[0]!=0){ 22 swap(b[0],b[b[0]]); 23 ++sum; 24 --ans; 25 } 26 else 27 for(int i=pos;i<n;++i) 28 if(b[i]!=i){ 29 swap(b[0],b[i]); 30 ++sum; 31 pos=i+1; 32 break; 33 } 34 cout<<sum; 35 return 0; 36 }