#include<bits/stdc++.h>
using namespace std;
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
int n;
cin>>n;
int a[n]={};
int cnt=0;
for(int i=0;i<n;i++){
int temp;
cin>>temp;
a[temp]=i;
if(temp!=i&&temp!=0) cnt++;
}
int ans=0;
int index=1;
//int sign[n]={};
while(cnt>0){
if(a[0]!=0){
//sign[a[0]]=1;
swap(a[0],a[a[0]]);
ans++;cnt--;
}else{
for(int i=index;i<n;i++){
if(a[i]!=i){
swap(a[0],a[i]);ans++;index=i;break;
}
}
}
}
cout<<ans<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
bool judge(map<int,int> ppp){
int flag=0;
map<int,int>::iterator it;
for(it=ppp.begin();it!=ppp.end();it++){
if(it->first!=it->second){
flag=1;break;
}
}
if(flag==1) return false;
else return true;
}
int _find(int k,map<int,int> ppp){
map<int,int>::iterator it;
for(it=ppp.begin();it!=ppp.end();it++){
if(it->second==k){
return it->first;
}
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
int n,k,ans=0;
cin>>n;map<int,int> ppp;
for(int i=0;i<n;i++){
int temp;
cin>>temp;
ppp[i]=temp;
if(temp!=i&&temp!=0) ans++;
if(temp==0) k=i;
}
int cnt=0;
int index=1;
while(ans>0){
if(k!=0){
int t=_find(k,ppp);
swap(ppp[k],ppp[t]);
k=t;
cnt++;ans--;
}else{
for(int i=index;i<n;i++){
if(ppp[i]!=i){
swap(ppp[0],ppp[i]);
k=i;index=i;
cnt++;break;
}
}
}
}
cout<<cnt;
return 0;
}
第一段代码AC,第二段代码19分飘过,两个的区别就是最初存储数据的结构,一个存下标,一个存数据,存下标的会快一点,不用费劲找下标了