1 条题解
-
0
我们仔细分析一下这道题。
题意理解
已知原来有一个长度为 的数组 ,满足:
- 所有元素两两不同。
- $a_1 = a_2 - a_3 + a_4 - a_5 + \dots + a_{2n} - a_{2n+1}$。
- 所有 是正整数 。
现在有人删掉 中的某一个元素(下标未知),然后把剩下的 个元素打乱成 。
我们需要恢复出 的一个可能序列。
分析
把原来的等式写成:
$$a_1 + a_3 + a_5 + \dots + a_{2n+1} = a_2 + a_4 + \dots + a_{2n} $$记奇数位置的和为 ,偶数位置的和为 ,那么有:
并且 既在奇数位置中,又出现在方程左边。
但已知的只有 (缺少一个元素),不知道被删掉的是奇数位置还是偶数位置,也不知道是哪一个。
关键观察
如果把 全部元素加起来:
$$\text{sum}(a) = S_{\text{odd}} + S_{\text{even}} = 2 S_{\text{even}} $$所以 原数组总和是偶数。而且 。
另外, 的取值刚好是“所有偶数位置元素的和”,它是 中一些元素加上可能的缺失元素的和。
因此:
如果我们假设缺失元素是 ,那么 必须能表示为 中某 个元素(即偶数位置元素)的和。
更具体地说:
设缺失的元素为 ,则 包含的 个元素分成两类:- 偶数位置的 个元素(和为 )
- 奇数位置的 个元素去掉 后剩下的 个(和为 )
但是 ,所以 。
因此 中的数可以分成两组,每组 个,其中一组的和等于 ,另一组的和等于 ,并且 是被删除的那个数,不在 中。
构造思路
- 对 排序。
- 枚举被删除的数 (应该是一个很大的数,因为 在等式中可以很大,不是必须取 中的数)。
- 如果我们确定 ,那么 必须是 中某些元素的和(恰好 个元素)。
- 由于 中每个数必须恰好属于一个组(奇数位置组或偶数位置组),且两组大小都是 ,所以 一定等于 ,因为 ,而 ,所以 。
- 因此 必须是偶数,且 必须是整数。
- 可以取任意不在 中的值吗?需要满足 能用 中的 个元素表示,且剩下的 个元素和是 ,其中 就是 。
所以 。
算法步骤
已知:
- 设 的总和 = 。
- 设缺失的元素为 (未知)。
- 则 。
- 。
- 奇数位置包含 ,以及 中某些元素,这些元素的和为 。
我们需要从 中选出 个数,和为 (偶数位置组),剩下 个数和为 (奇数位置组除了 外的数)。
同时奇数位置组的 个数可以随意排列(和 剩下的部分一样)。
所以构造方法:
- 令 为某个数,使得 是整数。
- 检查能否从 中找出 个数和为 。
- 如果找到了,那么剩下的 个数自动和为 ,这是奇数位置组(不含 )。
- 输出奇数位置组(任意顺序),中间插入 作为 ,然后偶数位置组按任意顺序放在 后面,形成 的任意顺序。
注意:奇数位置组(不含 )有 个元素,偶数位置组也有 个元素。交替排列即可得到序列 ,其中 。
如何找
有一个简单构造:
取 (或者任意大的数),这样 很大,而 中最大数 ,所以 很大, 不可能等于 中任意 个数的和(因为 个数和最大 如果 太大),所以不好。实际上我们需要 是 中 个数的和,所以 。
因此
。因为 ,所以 有一个上界,不一定要取大数。
但更简单的方法:
我们从 中选 个数作为偶数位置组,它们和 确定,那么 是被删除的数,需要 且 不在 中,并且 可以很大(只要 )。所以算法:
- 对 排序,设 为 总和。
- 取最大的 个数之和作为 (这样 很大, 很大,容易满足条件,且 可以构造出来)。
- 检查 是否不在 中且为正数。
- 如果 在 中,尝试次大的 个数和,直到找到可行解(因为 里数互异,总会找到一个 不在 中)。
这样构造的 ,奇数位置组: 中剩下的 个数,偶数位置组:选出的 个数。输出顺序:,然后交错输出奇数位置组和偶数位置组(先输出偶数位置组的一个数,再输出奇数位置组的一个数,等等),这样奇偶位置的和满足要求。
实现
我们可以简单取 ,设 ,如果 不在 中且 ,则成功;否则,依次减小 (比如把最大数换小一点),直到找到可行的 。
由于 不大(总和 ),可以用
multiset或双指针找。
示例验证
例1:
最大 个数是 ,,(不在 中)
偶数位置组:,奇数位置组:
输出: 符合样例。例2:
最大 个数:,(不在 中)
偶数位置组:,奇数位置组:
输出 (交错) 符合样例。
- 1
信息
- ID
- 6356
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者