您的位置:首页 > 其它

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

2015-08-29 03:39 489 查看


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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: