欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-28 21:47:38
...

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\n", count);
	return 0;
}