题解

cookiebus 2023-10-11 11:28:26 13 返回题目

Tag:排序、构造、分情况讨论

20 pt:比较想当然的写法,当 x>0时降序,x<0时升序。(没有考虑还有0这种特殊情况)

20 pt 全排列枚举,检查差分数组中是否出现x即可

100pt

其实细节比较多,你要考虑x是否为非0。

先按照x的大小分成三种情况

x>0 当x>0时,有一种特殊情况,就是x正好等于最大值,且最小值为0的情况。这个时候无论直接升序还是降序都不能满足条件,这个时候可以拿出一个非0且非x的其他数字放在第一位,然后放最大的数字,剩下的就可以随便放了。

否则不是这种特殊情况的你就可以直接降序排序输出。

x=0

当x=0时问题可以转化成:0不能放第一个,并且任意两个相同数字不能相邻,这其实是一个经典的鸽巢问题,即只要出现次数最多的数字不多于一半即可。

但是实际构造的过程中可以借助一个优先队列,每次都出队当前次数最多的数字即可。

x<0

因为输入的数组全部为非负整数,所以x<0时最简单,直接升序输出即可。

但是实际上你代码完全不用写的这么麻烦,你只用尝试一下 升序、降序、相邻不相同这三种方法是不是有一种可行,如果三种都不可行,说明无解。

{{ vote && vote.total.up }}