输入样例1
5
3 1 2 5 4
输出样例1
3
输入样例1
5
5 4 3 2 1
输出样例1
2
其实是一个图论的题目,并且需要用到一些数论的知识。
代码1:23ms
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
int que[N];
bool book[N];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&que[i]);
int cnt=0;
for(int i=1;i<=n;i++){
if(book[i]==false){
cnt++;
int j;
for(j=i;que[j]!=i;j=que[j]){
//cout<<j<<" "<<que[j]<<endl;
book[j]=true;
}
book[j]=true;
}
}
cout<<n-cnt<<endl;
return 0;
}
代码2:88ms
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
int que[N];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&que[i]);
int num=n;
int cnt=0;
int ex;
while(num){
for(int i=1;i<=n;i++){
if(que[i]!=-1){
cnt++;//环的个数加一
int now=i;
while(que[i]!=now){
ex=que[i];
num--;
que[i]=-1;
i=ex;
}
num--;
que[i]=-1;
}
}
}
cout<<n-cnt<<endl;
return 0;
}