问你交换两个数字后a[i] == i个数最多能有多少个。
读入数字时统计满足条件有多少个,然后判断,对应输出即可。
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int maxn = 100000 + 5;
int n;
int main(int argc, char const *argv[])
{
while(scanf("%d", &n) != EOF) {
int a[maxn], ans = 0;
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
if(a[i] == i) ans++;
}
if(ans == n) {
printf("%d\n", ans);
continue;
}
if(ans == n - 2) {
printf("%d\n", ans + 2);
continue;
}
bool flag = false;
for(int i = 0; i < n; ++i)
if(a[i] != i && i == a[a[i]]) {
flag = true;
break;
}
if(flag) printf("%d\n", ans + 2);
else printf("%d\n", ans + 1);
}
return 0;
}