蓝桥杯备考---》分类讨论之Fixed Points
这道题的意思啊,就是说我们在数组里输入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;
}
}