1 条题解

  • 0
    @ 2025-11-11 15:49:39

    题目理解

    我们有 NN 幅画,每幅画有大小 SiS_i 和美观度 ViV_i;有 MM 个画框,每个画框有大小 CjC_j

    约束条件

    1. 大小匹配:只有 SiCjS_i \leq C_j 的画 ii 才能放入画框 jj
    2. 排列顺序:展出的画必须按画框大小非递减排列
    3. 美观度顺序:展出的画必须按美观度非递减排列
    4. 一一对应:每个画框最多放一幅画,每幅展出的画必须放在一个画框中

    目标:最大化展出的画的数量。

    关键观察

    1. 问题转化

    这实际上是一个双关键字的最长公共子序列问题的变种:

    • 我们需要从画中选择一个子序列,从画框中选择一个相同长度的子序列
    • 画的美观度序列必须非递减
    • 画框的大小序列必须非递减
    • 并且每幅画必须能放入对应的画框中

    2. 排序简化

    由于两个序列都需要有序,我们可以先对画和画框进行排序:

    • 将画按美观度 ViV_i 升序排序
    • 将画框按大小 CjC_j 升序排序

    这样,问题转化为:在排序后的画序列和画框序列中,找到最长的配对,使得对于每个配对 (i,j)(i, j),有 SiCjS_i \leq C_j

    3. 贪心策略

    这是一个典型的贪心匹配问题:

    • 我们按美观度从小到大考虑画
    • 对于每幅画,我们选择能满足大小要求的最小的可用画框

    为什么这样最优

    • 如果我们把小的画框留给后面的画,可能后面有更大的画需要这个画框
    • 但美观度要求决定了画的选择顺序是固定的
    • 因此,对于当前画,使用最小的可用画框不会使结果变差

    算法设计

    1. 预处理步骤

    1. 排序画:按美观度 ViV_i 升序排序,美观度相同时可以按大小 SiS_i 升序排序
    2. 排序画框:按大小 CjC_j 升序排序

    2. 贪心匹配算法

    使用双指针或二分查找进行匹配:

    1. 初始化两个指针:i 指向第一幅画,j 指向第一个画框
    2. i < Nj < M 时:
      • 如果当前画 SiCjS_i \leq C_j(能放入当前画框):
        • 计数加一
        • ij 都移动到下一个位置
      • 否则:
        • j 移动到下一个画框(尝试更大的画框)

    3. 正确性分析

    这种贪心策略的正确性基于:

    • 画框的单调性:由于画框已排序,如果当前画框太小,后面的画框可能更小或更大,但我们需要找的是能满足条件的最小画框
    • 画的单调性:由于画按美观度排序,前面的画的美观度更小,应该优先匹配

    实际上,更精确的做法是使用二分查找

    • 对于每幅画,在剩余画框中二分查找最小的满足 CjSiC_j \geq S_i 的画框

    算法步骤总结

    1. 输入处理:读取画和画框的数据
    2. 排序
      • 画按 ViV_i 升序排序,ViV_i 相同时按 SiS_i 升序
      • 画框按 CjC_j 升序排序
    3. 贪心匹配
      • 使用双指针或二分查找进行匹配
      • 对于每幅画,找到最小的可用画框满足 SiCjS_i \leq C_j
    4. 输出结果:成功匹配的对数

    复杂度分析

    • 排序O(NlogN+MlogM)O(N \log N + M \log M)
    • 匹配
      • 双指针方法:O(N+M)O(N + M)
      • 二分查找方法:O(NlogM)O(N \log M)
    • 总复杂度O(NlogN+MlogM)O(N \log N + M \log M),对于 N,M105N, M \leq 10^5 可以接受

    边界情况处理

    1. 无解情况:所有画都太大,无法放入任何画框
    2. 重复值:多幅画有相同美观度时,按大小排序可以保证正确性
    3. 画框不足:画框数量可能少于画的数量

    算法变体

    另一种思路是使用贪心 + 平衡树

    • 将画框放入平衡树中
    • 对于每幅画,在平衡树中查找大于等于 SiS_i 的最小画框
    • 如果找到,使用该画框并从树中删除

    这种方法同样具有 O(NlogM)O(N \log M) 的复杂度。

    总结

    这道题的核心在于通过排序将复杂的两维约束简化,然后使用贪心算法进行匹配:

    1. 问题转化:将双关键字排序问题转化为单关键字匹配问题
    2. 排序简化:通过排序满足美观度和画框大小的顺序要求
    3. 贪心匹配:使用"最小可用"原则进行最优匹配
    4. 高效实现:利用双指针或二分查找实现线性或对数级别匹配

    这种"排序 + 贪心"的思路在解决带有多重约束的匹配问题时非常有效,是算法竞赛中的经典技巧。

    • 1

    信息

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