【PAT甲级】1067 Sort with Swap(0, i) (25 分)

题意:

输入一个正整数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 }

 

posted @ 2019-11-01 18:23  sewage  阅读(144)  评论(0编辑  收藏  举报