1 条题解
-
0
Standard Solution.
第一小题( 分)
第一部分( 分)
此时 FPT 的最坏时间复杂度是 。
第二部分( 分)
很明显, 和 的字典序相差越大,FPT 的总时间开销越大,因此最坏情况是 和 。
此外,当
next_permutation
函数的时间开销不小于 时,序列的最后 个数刚好是降序排列的。在最坏情况中,每种排列(共 个)都会在 FPT 的过程中出现一次,序列的最后 个数以任意大小关系出现的频率都相等,因此它们刚好降序排列的频率是 。此时总的时间复杂度是:
$$n! \times \sum _{i=1} ^n \large{(}\normalsize(\dfrac{1}{i!}-\dfrac{1}{(i+1)!}) \times O(i)\large{)} $$将括号展开(最后一项小于 ,本来就不存在,因此舍去):
$$n! \times \sum _{i=1} ^n \large{(}\normalsize\dfrac{1}{i!} \times O(1)\large{)} $$这是一个经典的求和问题,它的答案总是小于:
因为 是常数,所以总的时间复杂度是 。
第三部分( 分)
以下是一组可能的数据:
- 。
- 。
第二小题( 分)
第一部分( 分)
此时 FPT 的最坏时间复杂度是 。
第二部分( 分)
让我们再来看看 和 的情况。此时 FPT 的时间复杂度是 :
可以发现,每调用一次
next_permutation
函数,整个排列的逆序对个数最多增加 。由于 的逆序对个数是 , 的逆序对个数是 ,故此时此时 FPT 的时间复杂度是 ,而冒泡排序(每次只选择包含 个数字的区间调用
next_permutation
函数)可以实现这一时间复杂度。实际上,只要 ,冒泡排序就可以在 的时间复杂度内完成变换,其中 是 中逆序对的个数。
接下来,让我们对任意的 和 设计一个策略,使得 FPT 的时间复杂度是 。
首先,忽略 和 的最长公共前缀,因为它们不需要变换。
忽略它们的最长公共前缀后,设排列中剩下 个数,则用冒泡排序给后 个数排降序。
接下来,设 中的第一个数字为 , 中的第一个数字为 ,分两种情况讨论:
- 如果 ,我们对整个排列 调用一次
next_permutation
函数,使得数字 变成排列 中的第一个数字(其他数字升序排列),然后用冒泡排序对后 个数进行变换。 - 否则,只要我们先对 中以数字 为右端点的前缀 调用一次
next_permutation
函数,使得数字 变成排列 中的第一个数字(其他数字升序排列),再用冒泡排序对后 个数排降序,就可以按第一种情况处理了。
整个过程一共进行了 次冒泡排序,因此总的时间复杂度是 。
第三部分( 分)
以下是一组可能的数据:
- 。
- 。
- 1
信息
- ID
- 108
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 6
- 已通过
- 3
- 上传者