1 条题解

  • 0
    @ 2026-4-4 14:56:56

    题目解析

    给定一个长度为 nn 的数组 aa,初始全部为红色。
    操作分为两个阶段:

    1. 恰好选择 kk 个元素涂成蓝色(这 kk 个元素称为“初始蓝色”)。
    2. 反复选择一个有蓝色邻居的红色元素,将其涂蓝,直到全部蓝色为止。

    成本定义为:初始选择的 kk 个元素的和 ++ 最后一个被涂蓝的元素的值。
    目标:最大化成本。


    关键观察

    1. 成本的上界

    成本 = kk 个初始蓝色元素的和 ++ 最后一个被涂蓝的元素
    \le 数组中的 (k+1)(k+1) 个最大元素的和
    (因为 kk 个初始蓝色元素和最后一个蓝色元素最多覆盖 k+1k+1 个不同位置)。

    因此最大可能成本 ≤ 数组中最大的 k+1k+1 个元素的和。


    2. 何时能达到这个上界?

    情况 A:k2k \ge 2

    假设数组中最大的 k+1k+1 个元素的位置是 p1,p2,,pk+1p_1, p_2, \dots, p_{k+1}(值从大到小排列)。

    我们可以这样构造:

    • 初始蓝色选择:p1,p3,p4,,pk+1p_1, p_3, p_4, \dots, p_{k+1}(共 kk 个位置,不选 p2p_2)。
    • 涂色顺序:
      • 首先由初始蓝色向外扩散,最终除了 p2p_2 之外,所有元素都会变蓝(因为 p2p_2 左右邻接位置中有初始蓝色,例如 p1p_1p3p_3)。
      • 当只剩 p2p_2 为红色时,它的邻居(p1p_1p3p_3)已经是蓝色,所以可以最后涂 p2p_2

    这样:

    • kk 个初始蓝色的和为:除了 p2p_2 外的 kk 个最大元素之和。
    • 最后一个涂蓝的元素是 p2p_2(也是最大的 k+1k+1 个元素之一)。

    总成本 = kk 个最大元素的和 ++k+1k+1 大元素的值 = 最大的 k+1k+1 个元素的和。

    结论:当 k2k \ge 2 时,可以达到上界。


    情况 B:k=1k = 1

    此时上界是最大的两个元素的和,但能否达到?

    • 初始选一个元素 xx(记为 aia_i)。
    • 最后一个被涂蓝的元素必须是某条路径的终点。
    • 由于只有一次初始蓝色,整个涂色过程是从 aia_i 向两侧扩散。
    • 最后一个涂蓝的元素只能是最左端最右端的元素。

    为什么呢?
    想象从 aia_i 开始,每次只能涂邻居,那么扩展会像波浪一样左右推进,最后涂色的位置一定是左端 a1a_1 或右端 ana_n

    所以:

    • 如果初始选 aia_i2in12 \le i \le n-1),最后涂的是 a1a_1ana_n,成本 = ai+max(a1,an)a_i + \max(a_1, a_n)
    • 如果初始选 a1a_1,最后涂的是 ana_n,成本 = a1+ana_1 + a_n
    • 如果初始选 ana_n,最后涂的是 a1a_1,成本 = an+a1a_n + a_1

    这实际上等价于:

    • 初始元素必须与最后一个元素在两端相邻(通过扩展路径)? 不完全是,更简单的观察是:

      最后一个被涂的元素只能是 a1a_1ana_n
      另一个初始蓝色元素可以是任意其他位置。

      因此:

      • 若最后一个涂的是 ana_n,则初始选 ana_n 以外的某个元素 aja_j1jn11 \le j \le n-1),成本 = aj+ana_j + a_n,最大时 aja_j 取前 n1n-1 个最大值。
      • 若最后一个涂的是 a1a_1,则初始选 a1a_1 以外的某个元素 aja_j2jn2 \le j \le n),成本 = aj+a1a_j + a_1,最大时 aja_j 取后 n1n-1 个最大值。

      但注意最后一个被涂蓝的必须是 a1a_1ana_n,不一定是两个最大值的和。

    经过更严谨的分析(如标程所示),k=1k=1 时的最优解是以下两种可能的最大值:

    1. 最后一个涂 ana_n:初始选前 n1n-1 个元素中的最大值(即 max(a1an1)\max(a_1 \dots a_{n-1})),成本 = max(a1an1)+an\max(a_1 \dots a_{n-1}) + a_n
    2. 最后一个涂 a1a_1:初始选后 n1n-1 个元素中的最大值(即 max(a2an)\max(a_2 \dots a_n)),成本 = max(a2an)+a1\max(a_2 \dots a_n) + a_1

    取两者较大值。


    3. 特殊情况 k=n1k = n-1k2k \ge 2 时自动包括)

    此时 k+1=nk+1 = n,最大 k+1k+1 个元素就是整个数组的和,即能达到整个数组的和。

    检查标程:
    k>1k > 1 时,直接取前 k+1k+1 大元素的和,这包括了 k=n1k = n-1 的情况,此时就是所有元素的和,符合直觉。


    算法步骤

    1. 读入 tt
    2. 对每个测试用例:
      • 读入 n,kn, k 和数组 aa
      • k>1k > 1
        • aa 从大到小排序。
        • 答案 = 前 k+1k+1 个元素的和。
      • k=1k = 1
        • l=max(a1,a2,,an1)l = \max(a_1, a_2, \dots, a_{n-1})
        • r=max(a2,a3,,an)r = \max(a_2, a_3, \dots, a_n)
        • 答案 = max(l+an,r+a1)\max(l + a_n, r + a_1)
    3. 输出答案。

    时间复杂度

    • 排序 O(nlogn)O(n \log n)
    • nn 不超过 50005000,可轻松通过。

    例子验证

    例1

    n=3,k=1,a=[1,2,3]n=3, k=1, a=[1,2,3]
    l=max(1,2)=2, r=max(2,3)=3l = \max(1,2) = 2,\ r = \max(2,3) = 3
    答案 = max(2+3,3+1)=max(5,4)=5\max(2+3, 3+1) = \max(5,4) = 5,匹配输出。

    例2

    n=5,k=2,a=[4,2,3,1,3]n=5, k=2, a=[4,2,3,1,3]
    排序降序:[4,3,3,2,1][4,3,3,2,1]
    k+1=3k+1=3 个元素和 =4+3+3=10=4+3+3=10,匹配输出。

    例3

    n=4,k=3,a=[2,2,2,2]n=4, k=3, a=[2,2,2,2]
    k>1k>1,排序降序 [2,2,2,2][2,2,2,2]
    k+1=4k+1=4 个元素和 =2+2+2+2=8=2+2+2+2=8,匹配输出。


    总结

    • k2k \ge 2 时,直接取前 k+1k+1 大元素的和。
    • k=1k = 1 时,分两种情况取最大值,分别对应最后涂 ana_na1a_1
    • 该构造方法能达到理论最大值,因此贪心 + 构造即可。
    • 1

    信息

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