1 条题解
-
0
一、题目深度理解
1. 核心题意
给定 名学生,每名学生有编程能力值 和数学能力值 。需选择恰好2名学生组成团队,团队战斗力定义为:
要求找出所有可能的团队中,战斗力的最大值。
2. 关键概念拆解
- 战斗力是“两人编程和”与“两人数学和”中的较小值,我们需要让这个“较小值”尽可能大。
- 例如:若学生A(9,6)和学生B(9,9)组队,编程和为 ,数学和为 ,战斗力为 。
二、暴力解法分析(不可行)
最直观的思路是枚举所有 的学生对,计算每对的战斗力,取最大值。
- 时间复杂度:。当 时, 次操作,远超计算机每秒约 次操作的上限,必然超时。
- 结论:必须寻找更高效的算法。
三、优化思路:二分答案 + 排序 + 后缀最大值预处理
1. 二分答案的核心原理
我们要找最大的 ,使得存在至少一对学生 满足 。
- 单调性:若 可行(存在这样的学生对),则所有小于 的值都可行;若 不可行,则所有大于 的值都不可行。
- 转化问题:将“找最大值”转化为“验证某个值 是否可行”(即是否存在满足条件的学生对)。
2. 验证条件的转化
等价于 。因此:
$$\min(P_i+P_j, M_i+M_j) \ge mid \iff \begin{cases} P_i + P_j \ge mid \\ M_i + M_j \ge mid \end{cases} $$即我们需要验证:是否存在两个学生,其编程和 且 数学和 。
3. 验证策略(check函数)
为了高效验证,我们做以下预处理:
- 排序:将学生按 从小到大排序,方便后续二分查找。
- 后缀最大值数组:预处理 表示“从第 个学生到最后一个学生中, 的最大值”,可 查某区间的最大数学值。
验证步骤(遍历每个学生 作为第一个学生):
- 计算需要的最小 :(保证 )。
- 二分查找第一个 的位置 。
- 候选 的范围是 ( 避免重复)。
- 若候选范围的最大 (即 )满足 ,则 可行。
四、代码逐行详细解析

五、时间复杂度分析
操作 时间复杂度 说明 排序 对1e5个元素排序 预处理后缀最大值 单次遍历 二分查找 约21次迭代 每次check函数 遍历N个元素,每个二分 总时间复杂度:,对于 完全可行。
六、关键点总结
- 二分答案的核心:将“找最大值”转化为“验证可行性”,利用单调性降低复杂度。
- 条件转化: 等价于 且 ,是解题的关键一步。
- 预处理优化:排序+后缀最大值数组,将验证的时间复杂度从 降到 ,保证算法能处理1e5规模的数据。
- 1
信息
- ID
- 5653
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 57
- 已通过
- 6
- 上传者