1213 - 交换机器的最小代价


首先我们需要知道每一个机器,最终的位置,才能决定如何进行交换。

所有本来就在正确位置上的数字,不需要进行交换,以 2,3,1,5,4,6 为例:

其中 6 是不需要进行交换的,剩下的数字中 2,3,1 是一组, 5,4 是一组。

2,3,1 需要交换 2 次,

5,4 需要交换 1 次。

这样分组的原因是 2,3,1互相占了组内数字的位置, 3 个数形成了一个环,只需要进行 3−1=2 次交换,就可以让他们变得有序。

而 4,5组成了另一个环,只需要交换 2−1=1 次,就可以变得有序。

此外 6 可以看做单独的一个环。

因此需要的总的交换次数,等于数字的数量 6 减去 环的数量 3 。

为了让交换代价低,我们只在环内进行交换。

在环内交换方法不同,代价也不相同,利用贪心的思想,我们每次可以只交换环内最小的和当前的,这样的总代价是最小的。

这里其实还存在一个漏洞,那就是只在环内交换,一定是代价最小么?

因为还有这样一种特殊的操作,我们可以用所有数中最小的 mt ,先同环内最小的 mc 进行交换。然后套用上面的方法,只在环内进行交换,在环内除了 mt 之外,所有数字都处于正确位置后,再将 mc 换回来。这样有可能花费的代价更少。

利用这两种贪心的方法,就可以计算最小的代价了。