1 条题解
-
0
题目理解
我们有 幅画,每幅画有大小 和美观度 ;有 个画框,每个画框有大小 。
约束条件:
- 大小匹配:只有 的画 才能放入画框
- 排列顺序:展出的画必须按画框大小非递减排列
- 美观度顺序:展出的画必须按美观度非递减排列
- 一一对应:每个画框最多放一幅画,每幅展出的画必须放在一个画框中
目标:最大化展出的画的数量。
关键观察
1. 问题转化
这实际上是一个双关键字的最长公共子序列问题的变种:
- 我们需要从画中选择一个子序列,从画框中选择一个相同长度的子序列
- 画的美观度序列必须非递减
- 画框的大小序列必须非递减
- 并且每幅画必须能放入对应的画框中
2. 排序简化
由于两个序列都需要有序,我们可以先对画和画框进行排序:
- 将画按美观度 升序排序
- 将画框按大小 升序排序
这样,问题转化为:在排序后的画序列和画框序列中,找到最长的配对,使得对于每个配对 ,有 。
3. 贪心策略
这是一个典型的贪心匹配问题:
- 我们按美观度从小到大考虑画
- 对于每幅画,我们选择能满足大小要求的最小的可用画框
为什么这样最优?
- 如果我们把小的画框留给后面的画,可能后面有更大的画需要这个画框
- 但美观度要求决定了画的选择顺序是固定的
- 因此,对于当前画,使用最小的可用画框不会使结果变差
算法设计
1. 预处理步骤
- 排序画:按美观度 升序排序,美观度相同时可以按大小 升序排序
- 排序画框:按大小 升序排序
2. 贪心匹配算法
使用双指针或二分查找进行匹配:
- 初始化两个指针:
i指向第一幅画,j指向第一个画框 - 当
i < N且j < M时:- 如果当前画 (能放入当前画框):
- 计数加一
i和j都移动到下一个位置
- 否则:
j移动到下一个画框(尝试更大的画框)
- 如果当前画 (能放入当前画框):
3. 正确性分析
这种贪心策略的正确性基于:
- 画框的单调性:由于画框已排序,如果当前画框太小,后面的画框可能更小或更大,但我们需要找的是能满足条件的最小画框
- 画的单调性:由于画按美观度排序,前面的画的美观度更小,应该优先匹配
实际上,更精确的做法是使用二分查找:
- 对于每幅画,在剩余画框中二分查找最小的满足 的画框
算法步骤总结
- 输入处理:读取画和画框的数据
- 排序:
- 画按 升序排序, 相同时按 升序
- 画框按 升序排序
- 贪心匹配:
- 使用双指针或二分查找进行匹配
- 对于每幅画,找到最小的可用画框满足
- 输出结果:成功匹配的对数
复杂度分析
- 排序:
- 匹配:
- 双指针方法:
- 二分查找方法:
- 总复杂度:,对于 可以接受
边界情况处理
- 无解情况:所有画都太大,无法放入任何画框
- 重复值:多幅画有相同美观度时,按大小排序可以保证正确性
- 画框不足:画框数量可能少于画的数量
算法变体
另一种思路是使用贪心 + 平衡树:
- 将画框放入平衡树中
- 对于每幅画,在平衡树中查找大于等于 的最小画框
- 如果找到,使用该画框并从树中删除
这种方法同样具有 的复杂度。
总结
这道题的核心在于通过排序将复杂的两维约束简化,然后使用贪心算法进行匹配:
- 问题转化:将双关键字排序问题转化为单关键字匹配问题
- 排序简化:通过排序满足美观度和画框大小的顺序要求
- 贪心匹配:使用"最小可用"原则进行最优匹配
- 高效实现:利用双指针或二分查找实现线性或对数级别匹配
这种"排序 + 贪心"的思路在解决带有多重约束的匹配问题时非常有效,是算法竞赛中的经典技巧。
- 1
信息
- ID
- 5238
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者