1067 Sort with Swap(0, i) (25 分)
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.
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.
For each case, simply print in a line the minimum number of swaps need to sort the given permutation.
10
3 5 7 2 6 4 9 0 8 1
9
算法设计
这道题使用贪心算法,由于每次只能用0交换,有两种情况:
1. 0不在第0位,那么0如果在第i位,而第i位本应该是i,就应该把0和i数字所在的位置交换。
2. 如果0在第0位,查找序列中有无数字i不在第i位的,如果有则将0与第一个符合上述要求的数字的位置进行交换;如果没有说明序列有序结束算法。
注意点
在寻找不在本位上的数字时,如果每一次都从头开始枚举序列中的数,那么会有两个测试点超时,这时需要定义一个全局变量index,初始化为1,每次寻找不在本位上的数字时则从index位置的数字开始寻找,如果找到了就更新index,否则跳出循环结束算法。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include