版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/oytf10001/article/details/88594192
最小交换
时间限制:4 sec
空间限制:256 MB
问题描述
给定一个 1 到 n 的排列(即一个序列,其中 [1,n] 之间的正整数每个都出现了恰好 1 次)。
你可以花 1 元钱交换两个相邻的数。
现在,你希望把它们升序排序。求你完成这个目标最少需要花费多少元钱。
输入格式
第一行一个整数 n,表示排列长度。
接下来一行 n 个用空格隔开的正整数,描述这个排列。
输出格式
输出一行一个非负整数,表示完成目标最少需要花多少元钱。
样例输入
3
3 2 1
样例输出
3
样例解释
你可以:
花 1 元交换 1,2,序列变成 3 1 2。
花 1 元交换 1,3,序列变成 1 3 2。
花 1 元交换 2,3,序列变成 1 2 3。
总共需要花 3 元。
可以证明不存在更优的解。
数据范围
对于 20% 的数据,保证 n<=7。
对于 60% 的数据,保证 n<=1,000。
对于 100% 的数据,保证 n<=200,000。
提示
[每次交换相邻的两个数都会使逆序对 +1 或 -1。]
[逆序对数目不为零时,一定存在相邻的逆序对。]
[因此最优策略显然是每次都让逆序对数目 -1。]
[所以答案即为逆序对数目。]
[朴素的算法时间复杂度是 O(n^2) 的。]
[用归并排序求逆序对数可以通过本题。需要提醒的是,答案可能超过 32 位整数的范围哦。]
[逆序对数目同样可以用树状数组优化朴素的 O(n^2) 算法,并获得和归并排序相同的时间复杂度。有兴趣的同学可以自行学习。]
另外,为了帮助大家完成题目,我们提供了只包含了输入输出功能的程序模板,也提供了含有算法的大部分实现细节的程序。
你可以根据自己的实际情况,在这些程序的基础上进行作答,或不参考这些程序,这将与你的得分无关。
这些程序可以从【这里】下载。