1 条题解

  • 0
    @ 2026-4-2 16:42:06

    题目题解

    问题理解

    给定数组 aa,可以执行至多一次操作:选择 i<ji < j,令 ai:=ai+aja_i := a_i + a_j,然后 aj:=0a_j := 0
    目标是最小化前缀最小值之和:

    $$S = \min(a_1) + \min(a_1, a_2) + \dots + \min(a_1, a_2, \dots, a_n). $$

    第一步:分析前缀最小值序列

    mi=min(a1,a2,,ai)m_i = \min(a_1, a_2, \dots, a_i)
    显然 m1=a1m_1 = a_1,且序列 mim_i 是非递增的(因为取最小值只会变小或不变)。

    操作只会影响两个位置 iijji<ji < j):

    • aia_i 增加 aja_j,可能使 mim_i 变大(如果 aia_i 原来是前缀最小值)。
    • aja_j 变为 00,这会使 mj,mj+1,,mnm_j, m_{j+1}, \dots, m_n 变为 00(因为 00 是最小值)。

    因此,操作的关键作用是jj 及之后的所有前缀最小值变为 00


    第二步:不操作的情况

    若不操作,则 $S = a_1 + \min(a_1, a_2) + \dots + \min(a_1, \dots, a_n)$。
    由于 a1a_1 固定,Sa1S \ge a_1


    第三步:操作的可能效果

    考虑操作 (i,j)(i, j)

    • i=1i = 1,则 a1a_1 变为 a1+aja_1 + a_j,且 aj=0a_j = 0
      此时 m1=a1+ajm_1 = a_1 + a_jm2,,mj1m_2, \dots, m_{j-1} 不变(因为 a1a_1 变大不影响它们的最小值),mj,,mn=0m_j, \dots, m_n = 0
      总和变为:

      $$S = (a_1 + a_j) + \min(a_1, a_2) + \dots + \min(a_1, a_{j-1}) + 0 + \dots + 0. $$

      由于 min(a1,ak)a1\min(a_1, a_k) \le a_1(对 k<jk < j),该和至少为 a1+aja_1 + a_j
      实际上,可以取到 a1+aja_1 + a_j(当 j=2j=2a1a2a_1 \le a_2 时,min(a1,a2)=a1\min(a_1, a_2)=a_1,总和为 a1+a2a_1+a_2)。

    • i=2i = 2j=3j = 3n3n \ge 3),则 a2a_2 变为 a2+a3a_2 + a_3a3=0a_3 = 0
      此时 m1=a1m_1 = a_1m2=min(a1,a2+a3)m_2 = \min(a_1, a_2 + a_3)m3,=0m_3, \dots = 0
      总和为 a1+min(a1,a2+a3)a_1 + \min(a_1, a_2 + a_3)
      a1a2+a3a_1 \le a_2 + a_3,则和为 2a12a_1;否则为 a1+a2+a3a_1 + a_2 + a_3


    第四步:最优策略

    观察可知,最优操作总是涉及最小的几个下标,因为 00 会从 jj 开始向后传播。

    经过分析(可手动验证小 nn),最优结果总是以下两者之一:

    • 不操作:$S_0 = a_1 + \min(a_1, a_2) + \dots + \min(a_1, \dots, a_n)$。
    • 操作 (1,2)(1, 2)S1=a1+a2S_1 = a_1 + a_2(因为 m1=a1+a2m_1 = a_1+a_2m2=min(a1+a2,0)=0m_2 = \min(a_1+a_2, 0) = 0,后面全 00)。
    • 操作 (2,3)(2, 3)(当 n3n \ge 3a1a2a_1 \le a_2):S2=a1+min(a1,a2+a3)S_2 = a_1 + \min(a_1, a_2 + a_3)

    进一步推导可知,对于所有情况,最小可能值就是 min(2a1,a1+a2)\min(2a_1, a_1 + a_2)

    原因

    • a1a2a_1 \le a_2,不操作时 m1=a1m_1 = a_1m2=a1m_2 = a_1,后面至少 00,总和 2a1\ge 2a_1
      操作 (2,3)(2,3) 可得 a1+min(a1,a2+a3)2a1a_1 + \min(a_1, a_2+a_3) \ge 2a_1 或更大,但无法小于 2a12a_1
      而操作 (1,2)(1,2) 得到 a1+a22a1a_1 + a_2 \ge 2a_1,所以最小为 2a12a_1(当 a1a2a_1 \le a_2 时,a1+a22a1a_1+a_2 \ge 2a_1,所以 2a12a_1 更小或相等)。

    • a1>a2a_1 > a_2,不操作时 m1=a1m_1 = a_1m2=a2m_2 = a_2,后面至少 00,总和 a1+a2\ge a_1 + a_2
      操作 (1,2)(1,2) 得到 a1+a2a_1 + a_2,且 a1+a2<2a1a_1+a_2 < 2a_1(因为 a2<a1a_2 < a_1),所以最小为 a1+a2a_1 + a_2

    因此,答案统一为:

    min(2a1, a1+a2).\boxed{\min(2a_1,\ a_1 + a_2)}.

    第五步:边界情况

    • n=2n=2 时,无法操作 (2,3)(2,3),但上述公式仍然正确:
      a1>a2a_1 > a_2,答案为 a1+a2a_1 + a_2(操作 (1,2)(1,2));
      a1a2a_1 \le a_2,不操作得 a1+a1=2a1a_1 + a_1 = 2a_1,操作 (1,2)(1,2)a1+a22a1a_1+a_2 \ge 2a_1,所以最小为 2a12a_1

    • a2=0a_2 = 0 时,公式依然成立。


    算法步骤

    1. 读入 nn 和数组 aa
    2. 输出 min(2a1,a1+a2)\min(2a_1, a_1 + a_2)

    时间复杂度

    • 每个测试用例 O(1)O(1)(忽略输入)。
    • 总复杂度 O(n)O(\sum n),满足 2×1052\times 10^5 限制。

    代码实现

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        int n;
        cin >> n;
        vector<int> a(n);
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        cout << min(2 * a[0], a[0] + a[1]) << "\n";
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        
        int t;
        cin >> t;
        while (t--) {
            solve();
        }
        
        return 0;
    }
    

    验证样例

    测试用例 aa 2a12a_1 a1+a2a_1+a_2 min\min 输出
    1 [1,2][1,2] 2 3 2
    2 [1,2,3][1,2,3]
    3 [3,0,2,3][3,0,2,3] 6 3

    与题目输出一致。


    总结

    本题的关键在于:

    1. 理解操作如何影响前缀最小值序列。
    2. 发现只有前两个元素真正影响最优值。
    3. 得到简洁的闭式解 min(2a1,a1+a2)\min(2a_1, a_1 + a_2)
    • 1

    信息

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