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; }
相关文章推荐
- 5、通知和代理区别和使用
- Add Digits
- 4、iOS 开发之 UITableView
- 1032. Sharing (25)
- 1010 -- 青蛙的约会
- Binary Tree Paths
- 1009 -- 公约数和公倍数
- 1008 -- 大小写互换
- lvm基本应用,扩展及缩减实现
- 1007 -- Fibonacci 数
- 3、iOS 开发之 UIScrollView UIPageController NSTimer
- 1006 -- 5个数求最值
- 1005 -- 构造表达式
- LeetCode Palindrome Linked List
- LeetCode Palindrome Linked List
- 1004 -- “顺”序列
- Longest Substring Without Repeating Characters
- 2、iOS 开发之字典转模型和 xib
- 1003 -- 计算N!
- Hello World Using Struts 2