A1067 Sort with Swap(0, i) [贪心]

在这里插入图片描述
题目大意:给一串从0到n-1的数字无序,要求只能换0求最短的交换次数
思路:

  1. 贪心思想,先记录每个数字的位置,(有点绕)不在正确位置上的数字个数。
  2. 然后如果0不在开头,就把0占有的位置上应有的数字找出来和它交换。
  3. 如果0在开头,找一个不在应有位置上的数字交换,再进行第二步。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
int a[100001];
int main()
{
	int n,num;
	cin >> n; 
	int invalid = n - 1, count = 0;
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &num);
		a[num] = i;
		if (num == i && num != 0)
			invalid--;	
	}
	int k = 1;
	while (invalid > 0)
	{
		if (a[0] == 0)
		{
			while (k < n)
			{
				if (a[k] != k)
				{
					swap(a[0], a[k]);
					count++;
					break;
				}
				k++;
			}
		}
		while (a[0] != 0)
		{
			swap(a[0],a[a[0]]);
			count++;
			invalid--;
		}
	}
	printf("%d
", count);
	return 0;
}
原文地址:https://www.cnblogs.com/Hsiung123/p/13812068.html