这道题的意思啊,就是说我们在数组里输入n个数,我们尽可能让下标和数组的值相同,我们只能交换一次,最多能有多少个值和下标一样
这里我们需要分类讨论,如果每个下标的值都符合要求,我们就不交换了
如果不是都不符合要求,我们就要考虑怎么交换价值最高了
比如这样一组数,上面是值,下面是下标,我们交换一组数,可以交换下标0和下标4,这样的话我们就多了两个符合要求的数,然后最后的情况就是没有能够恰好交换两组数符合要求的
那就是交换完只能有一个数符合要求,比如这个,我们交换下标0,4的值,让1对应4,0对应0,只能多出一对儿出来
这就是三种情况的讨论,好的,我们来实现一下代码吧
#include <iostream>
using namespace std;
const int N = 1e5+10;int a[N];
int cnt;
int main()
{int n;cin >> n;bool flag = false;for(int i =0;i<n;i++){cin >> a[i];if(a[i] == i) cnt++;}if(cnt == n){cout << cnt << endl;}else{for(int i = 0;i<n;i++){if(a[i]!=i && a[a[i]] == i){cnt+=2;flag = true;break;}}if(!flag){cnt+=1;}cout << cnt << endl;}
}