题目链接
这道题需要多思考,其实是要寻找最终有几个环,这些环中若包含0,则需要交换的次数为环中元素数-1,若无0,则需要交换的次数为环中元素数+1,最终将各结果相加。
坑点:千万不要傻乎乎的去swap,会超时的!!
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
using namespace std;
int n;
int main()
{
scanf("%d", &n);
vector<int> a(n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
int nownum = 0;
int count = 0, total = 0;
int temp, pre;
for (; nownum < n; nownum++)
{
if (a[nownum] != nownum)
{
count = 2;
pre = a[nownum];
a[nownum] = nownum;
while (a[pre]!=pre)
{
count++;
if (a[pre] == 0)
count = count - 2;
temp = a[pre];
a[pre] = pre;
pre = temp;
}
total += count;
}
}
printf("%d", total);
return 0;
}