[注意]0交换
Sample Input:
10 3 5 7 2 6 4 9 0 8 1
Sample Output:
9
题目大意:给出一个n个数的序列,数字为0~n-1的乱序,每次用两两交换的方式而且只能用0和另一个数交换,使序列变成有序的,问最少需要多少步骤。
分析:
首先,如果0不在0位置,就不停把他换到当前位置值所在的位置,直到0回归0位置,如果还存在值与位置值不符合的点,肯定是成对存在的,
不妨对0~n-1再扫一遍,拿题目样例来说,位置下标从0开始,最初是3572649081,0在7位置,那么就和7换一下,为3502649781,然后继续,
直到变成0523649781,0回到0位置了,一共换了3步,排序还没结束,此时对1~n-1扫一遍,发现5的位置不对,0与5交换,为5023649781,
此时换了4步了,继续刚才的操作终于变为0123456789,最后经过了9步变换。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n,d,c = 0,b = 0;
int s[100005];
scanf("%d",&n);
for(int i = 0;i < n;i ++)
{
scanf("%d",&d);
s[d] = i;
}
while(s[0])
{
int p = s[0];
s[0] = s[p];
s[p] = p;
c ++;
}
for(int i = 0;i < n;i ++)
{
if(s[i] != i)
{
c ++;
d = s[i];
s[i] = 0;
s[0] = d;
while(s[0])
{
int p = s[0];
s[0] = s[p];
s[p] = p;
c ++;
}
}
}
printf("%d",c);
}
浙公网安备 33010602011771号