1 条题解

  • 0
    @ 2026-8-30 10:55:13

    题解

    思路

    集合价值

    设某个非空颜色集合的球数总和为 SS,其中最大的球数为 MM。

    每组最多放两个球,所以至少需要 ⌈S/2⌉\lceil S/2\rceil 组;同一种颜色的两个球不能同组,所以数量最多的颜色又要求至少 MM 组。反过来,总能把其他颜色的球尽量与最大颜色配对,剩余球再两两配对,因此集合价值恰为

    max⁡(M,⌈S/2⌉).\max(M,\lceil S/2\rceil).

    做法

    子任务 1

    当所有 ai=1a_i=1 时,只需按集合大小 kk 分类。大小为 kk 的集合有 (nk)\binom nk 个,价值为 ⌈k/2⌉\lceil k/2\rceil。预处理阶乘和逆阶乘即可在线性时间内求和。

    子任务 2

    当 n≤20n\le20 时,枚举全部颜色子集,直接统计每个子集的 SS 与 MM,累加上式。

    完整算法

    将 aia_i 从小到大排序。考虑当前元素 xx,以及只从此前元素中选择、球数和为 ss 的子集。加入 xx 后,xx 一定是这个集合中最后加入的最大值,因此它对答案的贡献为

    max⁡(x,⌈(s+x)/2⌉).\max(x,\lceil(s+x)/2\rceil).

    用一维背包维护此前元素组成每个和 ss 的子集数量。处理 xx 时,先枚举所有已有的 ss 并累加贡献,再做从大到小的背包转移

    dps+x+=dps.dp_{s+x}\mathrel{+}=dp_s.

    每个非空子集都有唯一的最后一个下标,所以它恰好在处理该下标时被计入一次。

    正确性证明

    对任意非空颜色集合,令排序后下标最大的已选颜色球数为 xx,其余已选颜色的球数和为 ss。因为数组已排序,xx 就是该集合的最大球数,集合价值等于 max⁡(x,⌈(s+x)/2⌉)\max(x,\lceil(s+x)/2\rceil)。

    背包中的 dpsdp_s 恰好统计了从 xx 之前的颜色中选出、球数和为 ss 的方案数,因此算法会以正确价值计入所有以当前下标为最后下标的集合。每个非空集合的最后下标唯一,故所有集合都被计入且恰好计入一次,最终答案正确。

    复杂度

    记 A=∑ai≤5000A=\sum a_i\le5000。完整算法的时间复杂度为 O(nA)O(nA),空间复杂度为 O(A)O(A)。

    • 1

    信息

    ID
    1161
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者