题意:在n个数中,只可能的数是再(0~n-1)的数,如果有些数所在的位置(0~n-1)刚好等于它的值,就是好点。问:你只能交换一对,交换后好点最多的个数。
没什么算法。
#include<iostream> #include<cstdio> #include<cstring> using namespace std ; int f[100005]; int main() { int n,ans,num; bool flag; while(scanf("%d",&n)!=EOF){ memset(f,-1,sizeof(f)); ans=0; flag=0; for(int i=0;i<n;i++){ scanf("%d",&num); f[i]=num; if(num==i) ans++; else{ if(i==f[num]) flag=1; } } if(ans==n){ printf("%d\n",ans); continue; } if(flag) printf("%d\n",ans+2); else printf("%d\n",ans+1); } return 0 ; }