前言:
该题主要是算环
关键点:
1、如果当0所处的位置就为下标为0的位置时,那么交换次数就为N-S+K;其他就直接N-S+K-2;
完整代码:
# include <stdio.h>
int n;
int cnt, pos, total=0;
int a[100000+10];
int S, K, flag;
int main()
{
scanf("%d", &n);
for (int i=0; i<n; i++)
{
scanf("%d", &a[i]);
if (a[i]==i)
{
S++;
if (i==0)
flag = 1;
}
}
for (int i=0; i<n; i++)
{
if (a[i]!=i)
{
K++;
while (a[i]!=i)
{
int tmp = a[i];
a[i] = i;
i = tmp;
}
}
}
if (flag)
printf("%d\n", n-S+K);
else
printf("%d\n", n-S+K-2);
return 0;
}