1 条题解

  • 0
    @ 2026-5-8 15:44:30

    题目分析

    我们已知:

    • 平均值 mean=a\text{mean} = a
    • 中位数 median=b\text{median} = b
    • 数组长度 nn1110001000 之间
    • 数组元素是整数,绝对值不超过 10610^6
    • a,ba, b 的范围是 [100,100][-100, 100]

    需要构造一个满足条件的数组。

    关键观察

    1. nn 为奇数时: 中位数是排序后中间那个数,所以数组必须包含 bb 作为中间元素。

    2. nn 为偶数时: 中位数是中间两个数的平均值,所以如果中间两个数是 xxyy,那么 (x+y)/2=b(x+y)/2 = b,即 x+y=2bx+y = 2b

    构造思路

    最简单的方法是让数组只包含两种数:bb 和一些其他数来控制平均值。

    设我们选择 kkbb,以及若干个数来调整平均值。

    方案一:让数组元素都相等 如果所有元素都等于 bb,那么中位数就是 bb,平均值也是 bb。所以当 a=ba = b 时,直接输出 nnbb 即可,其中 1n10001 \le n \le 1000

    方案二:当 aba \neq b

    我们让数组由两部分组成:

    • mmbb(用来保证中位数是 bb
    • 一些其他数来调整平均值

    为了构造方便,我们选择:

    • 中位数位置放 bb
    • 其余位置放可调整的数

    具体构造方法:

    设数组长度为 n=3n = 3(奇数时):

    • 排序后的数组为 [x,b,y][x, b, y],其中 xbyx \le b \le y
    • 中位数是 bb
    • 平均值:(x+b+y)/3=ax+y=3ab(x + b + y)/3 = a \Rightarrow x + y = 3a - b

    由于 xbyx \le b \le y,我们可以构造:

    • x=bdx = b - dy=b+dy = b + d,但这样 x+y=2bx+y = 2b,则 2b=3ab3b=3ab=a2b = 3a - b \Rightarrow 3b = 3a \Rightarrow b=a,不适用于 aba \neq b

    所以不能这样。我们固定 xx 为一个适当的值,然后计算 yy

    由于 xbx \le b,我们取 x=min(b,(某个数))x = \min(b, \text{(某个数)}),但更好的方法是:

    x=b1x = b - 1(如果 b1bb-1 \le b,总是成立), 则 y=3abx=3ab(b1)=3a2b+1y = 3a - b - x = 3a - b - (b-1) = 3a - 2b + 1

    只要 yby \ge bx,y106|x|,|y| \le 10^6 即可。但 yy 可能太小。

    更好的构造:使用更多元素

    使用对称构造:设数组长度为 n=2m+1n = 2m+1(奇数),排序后为:

    [c,c,...,c,b,d,d,...,d][c, c, ..., c, b, d, d, ..., d]

    其中 cc 出现 mm 次,dd 出现 mm 次,bb 出现 11 次。

    条件:

    • 中位数是 bb,需要 cbdc \le b \le d
    • 总元素:n=2m+1n = 2m+1
    • 总和:mc+b+md=m(c+d)+bm \cdot c + b + m \cdot d = m(c+d) + b
    • 平均值:m(c+d)+b2m+1=a\frac{m(c+d) + b}{2m+1} = a
    • 所以 m(c+d)+b=a(2m+1)m(c+d) + b = a(2m+1)
    • c+d=a(2m+1)bmc+d = \frac{a(2m+1) - b}{m}

    为了让 ccdd 为整数且 cbdc \le b \le d,我们可以选择 mm 使得分子能被 mm 整除。

    m=1m=1,即 n=3n=3c+d=a(3)b=3abc+d = a(3) - b = 3a - b

    我们取 c=bc = b,则 d=3a2bd = 3a - 2b。 条件:cbdc \le b \le dbbb \le b 且 $b \le 3a-2b \Rightarrow 3b \le 3a \Rightarrow b \le a$

    如果 bab \le a,这个构造可行。 如果 b>ab > a,则 d<bd < b,不满足 bdb \le d

    因此分两种情况:

    情况 1:bab \le a

    n=3n=3,数组:[b,b,3a2b][b, b, 3a-2b] 排序后:[b,b,3a2b][b, b, 3a-2b]

    • 中位数:bb
    • 平均值:(b+b+3a2b)/3=3a/3=a(b + b + 3a-2b)/3 = 3a/3 = a
    • 需要检查 b3a2bb \le 3a-2bbab \le a,满足
    • 还需要 3a2b106|3a-2b| \le 10^6,由于 a,b100|a|,|b| \le 100,所以 3a2b500106|3a-2b| \le 500 \le 10^6,满足

    情况 2:b>ab > a

    此时 bab \le a 不成立,我们用另一种构造: 取 n=3n=3,数组:[3a2b,b,b][3a-2b, b, b] 排序后:[3a2b,b,b][3a-2b, b, b]

    • 中位数:bb
    • 平均值相同:(3a2b+b+b)/3=3a/3=a(3a-2b + b + b)/3 = 3a/3 = a
    • 需要 3a2bb3a-2b \le b3a3bab3a \le 3b \Rightarrow a \le b,满足
    • 同样 3a2b500106|3a-2b| \le 500 \le 10^6,满足

    情况 3:a=ba = b

    此时我们可以用一个更简单的构造: 取 n=1n=1,数组:[a][a],中位数和平均数都是 aa

    算法步骤

    1. 如果 a=ba = b,输出长度为 1 的数组 [a][a]
    2. 否则:
      • 如果 bab \le a,输出 [b,b,3a2b][b, b, 3a-2b]
      • 如果 b>ab > a,输出 [3a2b,b,b][3a-2b, b, b]

    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;
    }
    

    证明

    正确性验证

    bab \le a: 数组 [b,b,3a2b][b, b, 3a-2b]

    • 排序后:若 b3a2bb \le 3a-2b(由 bab \le a 推出 3b3a3b \le 3a,即 b3a2bb \le 3a-2b),排序为 [b,b,3a2b][b, b, 3a-2b],中位数是 bb; 若 3a2b<b3a-2b < b,则排序为 [3a2b,b,b][3a-2b, b, b],中位数仍是 bb
    • 平均值:(b+b+3a2b)/3=3a/3=a(b + b + 3a-2b)/3 = 3a/3 = a

    b>ab > a: 数组 [3a2b,b,b][3a-2b, b, b]

    • 排序后:若 3a2bb3a-2b \le b(由 aba \le b 推出 3a3b3a \le 3b,即 3a2bb3a-2b \le b),排序为 [3a2b,b,b][3a-2b, b, b],中位数是 bb; 若 b<3a2bb < 3a-2b,则排序为 [b,b,3a2b][b, b, 3a-2b],中位数仍是 bb
    • 平均值:(3a2b+b+b)/3=3a/3=a(3a-2b + b + b)/3 = 3a/3 = a

    边界检查: $|3a-2b| \le 3 \times 100 + 2 \times 100 = 500 \le 10^6$,满足绝对值限制。

    复杂度

    • 时间复杂度:O(1)O(1)
    • 空间复杂度:O(1)O(1)
    • 1

    信息

    ID
    7012
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    1
    已通过
    1
    上传者