1067. Sort with Swap(0,*) (25)

1067. Sort with Swap(0,*) (25)

时间限制
150 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

Given any permutation of the numbers {0, 1, 2,..., N-1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the following way:

Swap(0, 1) => {4, 1, 2, 0, 3}
Swap(0, 3) => {4, 1, 2, 3, 0}
Swap(0, 4) => {0, 1, 2, 3, 4}

Now you are asked to find the minimum number of swaps need to sort the given permutation of the first N nonnegative integers.

Input Specification:

Each input file contains one test case, which gives a positive N (<=105) followed by a permutation sequence of {0, 1, ..., N-1}. All the numbers in a line are separated by a space.

Output Specification:

For each case, simply print in a line the minimum number of swaps need to sort the given permutation.

Sample Input:
10 3 5 7 2 6 4 9 0 8 1
Sample Output:
9
    其实这道题目还有一点来历,是一个叫圈排序的算法,我好想还在不知道哪里发现了一道sort with swap(,),并不要求用0,进行交换。首先明确一点,任何一个序列都是由环构成的。一个排序后的序列可以将每个元素视为一个环,任意交换其中的两个元素,我们就获得了一个双元环(A在B的位置,B在A的位置)。同样的方法可以理解三元环(A在B的位置,B在C的位置,C在A的位置)。将一个n元环调整到位总共需要你n-1次交换。在本题中,因为限定使用0进行交换,如果该n元环中有0,那么交换次数即为n-1,如果没有,我们需要一步交换将0挪进这个圆,然后需要n步交换使该n+1元环归位。
    实测你的代码只要能解出一下两组数据,应该就是对的了。
/*
10
0 1 2 3 4 5 6 7 9 8
*/
/*
10
1 0 2 3 4 5 6 7 8 9
*/

# include <cstdio>
# include <iostream>
using namespace std;

const int debug = 0;
const int size =  100050;

int num[size];
int tag[size];
int n;
int Sort(int i)
{
    int cnt = 1;
    int loca = num[i],flag = 0;
    if (loca==0) flag = 1;
    while (loca!=i)
      {
        tag[loca] = 1;
		loca = num[loca];
		if (loca==0) flag = 1;
        cnt++;
 	  }
    if (flag) cnt--;
    else  cnt++;
    return cnt;
}

int main()
{
	int i,j;
    int ans = 0;
    cin >> n;
    for (i=0;i<n;i++)
      scanf("%d",num+i);
    for (i=0;i<n;i++)
      if (num[i]!=i&&tag[i]==0)
         ans += Sort(i);
    cout << ans << endl;
	return 0;
}

1067. Sort with Swap(0,*) (25)_第1张图片

你可能感兴趣的:(排序,圈排序)