1 条题解

  • 0
    @ 2026-1-11 9:14:29

    一、题目深度理解

    1. 核心题意

    给定 NN 名学生,每名学生有编程能力值 PiP_i 和数学能力值 MiM_i。需选择恰好2名学生组成团队,团队战斗力定义为:

    战斗力=min(Pi+Pj, Mi+Mj)\text{战斗力} = \min(P_i + P_j,\ M_i + M_j)

    要求找出所有可能的团队中,战斗力的最大值

    2. 关键概念拆解

    • 战斗力是“两人编程和”与“两人数学和”中的较小值,我们需要让这个“较小值”尽可能大。
    • 例如:若学生A(9,6)和学生B(9,9)组队,编程和为 9+9=189+9=18,数学和为 6+9=156+9=15,战斗力为 min(18,15)=15\min(18,15)=15

    二、暴力解法分析(不可行)

    最直观的思路是枚举所有 i<ji<j 的学生对,计算每对的战斗力,取最大值。

    • 时间复杂度:O(N2)O(N^2)。当 N=105N=10^5 时,N2=1010N^2=10^{10} 次操作,远超计算机每秒约 10810^8 次操作的上限,必然超时。
    • 结论:必须寻找更高效的算法。

    三、优化思路:二分答案 + 排序 + 后缀最大值预处理

    1. 二分答案的核心原理

    我们要找最大的 XX,使得存在至少一对学生 (i,j)(i,j) 满足 min(Pi+Pj,Mi+Mj)X\min(P_i+P_j, M_i+M_j) \ge X

    • 单调性:若 XX 可行(存在这样的学生对),则所有小于 XX 的值都可行;若 XX 不可行,则所有大于 XX 的值都不可行。
    • 转化问题:将“找最大值”转化为“验证某个值 midmid 是否可行”(即是否存在满足条件的学生对)。

    2. 验证条件的转化

    min(A,B)mid\min(A,B) \ge mid 等价于 Amid  BmidA \ge mid \textbf{ 且 } B \ge mid。因此:

    $$\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} $$

    即我们需要验证:是否存在两个学生,其编程和 mid\ge mid 数学和 mid\ge mid

    3. 验证策略(check函数)

    为了高效验证,我们做以下预处理:

    • 排序:将学生按 PiP_i 从小到大排序,方便后续二分查找。
    • 后缀最大值数组:预处理 h[i]h[i] 表示“从第 ii 个学生到最后一个学生中,MiM_i 的最大值”,可 O(1)O(1) 查某区间的最大数学值。

    验证步骤(遍历每个学生 ii 作为第一个学生):

    1. 计算需要的最小 PjP_jcj=midPicj = mid - P_i(保证 Pi+PjmidP_i + P_j \ge mid)。
    2. 二分查找第一个 PjcjP_j \ge cj 的位置 xbxb
    3. 候选 jj 的范围是 [max(xb,i+1),n][\max(xb, i+1), n]j>ij>i 避免重复)。
    4. 若候选范围的最大 MjM_j(即 h[max(xb,i+1)]h[\max(xb, i+1)])满足 Mi+MjmidM_i + M_j \ge mid,则 midmid 可行。

    四、代码逐行详细解析

    五、时间复杂度分析

    操作 时间复杂度 说明
    排序 O(NlogN)O(N\log N) 对1e5个元素排序
    预处理后缀最大值 O(N)O(N) 单次遍历
    二分查找 O(log2e6)O(\log 2e6) 约21次迭代
    每次check函数 O(NlogN)O(N\log N) 遍历N个元素,每个二分O(logN)O(\log N)

    总时间复杂度O(NlogN+21×NlogN)=O(NlogN)O(N\log N + 21 \times N\log N) = O(N\log N),对于 N=105N=10^5 完全可行。

    六、关键点总结

    1. 二分答案的核心:将“找最大值”转化为“验证可行性”,利用单调性降低复杂度。
    2. 条件转化min(A,B)mid\min(A,B)≥mid 等价于 AmidA≥midBmidB≥mid,是解题的关键一步。
    3. 预处理优化:排序+后缀最大值数组,将验证的时间复杂度从 O(N2)O(N^2) 降到 O(NlogN)O(N\log N),保证算法能处理1e5规模的数据。
    • 1

    信息

    ID
    5653
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    57
    已通过
    6
    上传者