P1335 末日的传说题解

212 阅读1分钟

昨天想这一题想了很久, 因为总感觉其他人的题解写错了, 后来才发现是我自己想错了

下面附上别人的说法

所以如果当前m不比当前的(n-2)*(n-1)/2(也就是减少一个数之后的最多的逆序对数)大,

就可以直接把当前的最小数放在最前面,这肯定是最优的。

反之,则考虑最小数的放置位置。

假设当前排列长为n,最小数为a,则a有n种放法,放在从左到右第i个位置时会生成i-1个逆序对

(因为它左边有i-1个比他大)。

因为m大于n-1长度排列最多所能产生的逆序数,所以a不可能放在最前面,否则不满足条件。

怎么办呢?所以a要放到最后,这样m减少的最多。

这里我一直无法理解为何m > n - 1 长度排列所能产生的逆序数的话, a就要放到最后, 我一直死磕的认为, 这里需要判断应该放在哪, 后来按照我的思路实现了代码后, 发现结果并不是最小的, 后来我才发现, 真的是要放到最后, 下面我来说明原因

因为若第i个数不能放在第i位(即此时m > n - 1 长度排列所能产生的逆序数), 那么它确实应该放在越后面越好, 因为这样放在第i位的数可以更小, 那么这个字典序相应的也会更小

不知道我说清楚没有, 但我觉得我说清楚.