这个题我想的比较复杂,找到规律,每增加一个回环,次数加一,当0初始不在无序回环中时,次数加2。
用一个hash表表示已经遍历的回环。
一开始用的暴力法,有两个点为超时,如果考试果断跳。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<vector>
using namespace std;
bool b[100000]={};
int a[100000]={};
int main(){
int n,step,num=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
if(a[i]==i) b[i]=true;
else num++;
}
if(num==0) {
printf("0");
return 0;
}
else num--;
if (a[0]==0) num+=2;
for(int i=0;i<n;i++){
step=i;
if(b[step]!=true){
while(b[step]!=true){
b[step]=true;
step=a[step];
}
num++;
printf("*");
}
}
printf("%d",num-1);
return 0;
}