1 条题解
-
0
题目分析
我们已知:
- 平均值
- 中位数
- 数组长度 在 到 之间
- 数组元素是整数,绝对值不超过
- 的范围是
需要构造一个满足条件的数组。
关键观察
-
当 为奇数时: 中位数是排序后中间那个数,所以数组必须包含 作为中间元素。
-
当 为偶数时: 中位数是中间两个数的平均值,所以如果中间两个数是 和 ,那么 ,即 。
构造思路
最简单的方法是让数组只包含两种数: 和一些其他数来控制平均值。
设我们选择 个 ,以及若干个数来调整平均值。
方案一:让数组元素都相等 如果所有元素都等于 ,那么中位数就是 ,平均值也是 。所以当 时,直接输出 个 即可,其中 。
方案二:当 时
我们让数组由两部分组成:
- 个 (用来保证中位数是 )
- 一些其他数来调整平均值
为了构造方便,我们选择:
- 中位数位置放
- 其余位置放可调整的数
具体构造方法:
设数组长度为 (奇数时):
- 排序后的数组为 ,其中
- 中位数是
- 平均值:
由于 ,我们可以构造:
- 让 ,,但这样 ,则 ,不适用于
所以不能这样。我们固定 为一个适当的值,然后计算 。
由于 ,我们取 ,但更好的方法是:
取 (如果 ,总是成立), 则
只要 且 即可。但 可能太小。
更好的构造:使用更多元素
使用对称构造:设数组长度为 (奇数),排序后为:
其中 出现 次, 出现 次, 出现 次。
条件:
- 中位数是 ,需要
- 总元素:
- 总和:
- 平均值:
- 所以
- 故
为了让 和 为整数且 ,我们可以选择 使得分子能被 整除。
取 ,即 :
我们取 ,则 。 条件: 即 且 $b \le 3a-2b \Rightarrow 3b \le 3a \Rightarrow b \le a$
如果 ,这个构造可行。 如果 ,则 ,不满足 。
因此分两种情况:
情况 1:
取 ,数组: 排序后:
- 中位数:
- 平均值:
- 需要检查 即 ,满足
- 还需要 ,由于 ,所以 ,满足
情况 2:
此时 不成立,我们用另一种构造: 取 ,数组: 排序后:
- 中位数:
- 平均值相同:
- 需要 即 ,满足
- 同样 ,满足
情况 3:
此时我们可以用一个更简单的构造: 取 ,数组:,中位数和平均数都是 。
算法步骤
- 如果 ,输出长度为 1 的数组
- 否则:
- 如果 ,输出
- 如果 ,输出
C++ 代码
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int a, b; cin >> a >> b; if (a == b) { // 平均值和中位数相等的情况 cout << "1\n"; cout << a << "\n"; } else if (b <= a) { // 情况1: b <= a cout << "3\n"; cout << b << " " << b << " " << 3 * a - 2 * b << "\n"; } else { // 情况2: b > a cout << "3\n"; cout << 3 * a - 2 * b << " " << b << " " << b << "\n"; } return 0; }证明
正确性验证
当 时: 数组
- 排序后:若 (由 推出 ,即 ),排序为 ,中位数是 ; 若 ,则排序为 ,中位数仍是 。
- 平均值:
当 时: 数组
- 排序后:若 (由 推出 ,即 ),排序为 ,中位数是 ; 若 ,则排序为 ,中位数仍是 。
- 平均值:
边界检查: $|3a-2b| \le 3 \times 100 + 2 \times 100 = 500 \le 10^6$,满足绝对值限制。
复杂度
- 时间复杂度:
- 空间复杂度:
- 1
信息
- ID
- 7012
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者