POJ 1674

来源:互联网 发布:如何才能看网络电视 编辑:程序博客网 时间:2024/05/18 02:27

题意:给一个由1-n的整数组成的数列。对其进行交换两个数的操作。请问最少需要多少次操作,使得数列变成升序的1-n

思路:

举个例子来说,2 5 4 3 1。我们让 i 从1开始判断是否在i是否在该在的位置上。此时i=1不在位置1上,而且位置1上是2。2应该放在位置2上,而位置2上是5。位置5上是1。这就说明1,2,5三个数轮换一下,就能将这三个数换到各自应该在的位置。需要换2次。

顺着这个思路想,可以把1,2,5看成一个环,3,4看成另一个环。那么最后的答案就是 整个数列中不在各自该在位置的数的数量 - 环数。此例子中,就是5-2=3

所以,一个环中,如果有x个数,那么这个环需要x-1次操作。剩下的重点就是找出所有的环了。相信大家都会做了

大家可以想想为什么这个算法是正确的

总结:1Y, 250ms

 

注:sum记录整个数列需要的交换次数,nums记录一个环内的数的个数。found记录在这个数列中i是否被找到过,mk记录本次沿着环找数时i是否被找到过。

 

 

 

 

原创粉丝点击