1 条题解

  • 0
    @ 2025-10-23 16:30:32

    题意

    我们有一个队列操作过程:

    1. 每次取队列前 33
    2. 淘汰最大值和最小值(按特定规则打破平局)
    3. 保留中间值并移到队尾
    4. 重复直到只剩 11 人,此人与公主组队

    已知 MM 个贵族的位置固定,其余 NMN-M 个可以自由排列。目标是最大化最终剩下贵族的舞蹈熟练度。


    关键观察

    1. 二分答案可行性

    我们可以二分最终与公主组队的贵族熟练度 XX

    问题转化为:是否存在一种排列方式,使得某个熟练度 X\geq X 的贵族能够"幸存"到最后。

    2. 强者标记策略

    对于候选值 XX

    • 标记所有熟练度 X\geq X 的贵族为"强者"(用 11 表示)
    • 标记所有熟练度 <X< X 的贵族为"弱者"(用 00 表示)

    目标:让至少一个 11 留到最后。

    3. 匹配过程分析

    每次处理前 33 人时,有 44 种情况:

    1. 111 → 淘汰两个 11,保留一个 11 到队尾
    2. 110 → 淘汰一个 11 和一个 00,保留 1100(取决于谁是中间值)
    3. 100 → 淘汰一个 11 和一个 00,保留 00
    4. 000 → 淘汰两个 00,保留一个 00

    关键:我们要尽量让 11 存活下来。


    算法思路

    1. 构建初始队列

      • 固定位置的贵族必须放在指定位置
      • 未固定位置的贵族可以自由安排
      • 策略:尽量把强者(11)放在队列后部,弱者(00)放在前部
    2. 模拟匹配过程

      • 维护当前队列(用双端队列或数组)
      • 每次取前 33 人,按规则淘汰和保留
      • 跟踪队列中是否还有 11
    3. 返回结果:最终剩下的贵族是否为 11


    贪心排列策略

    在构建初始队列时:

    • 固定位置的贵族:按给定位置放置
    • 未固定位置的贵族:
      • 将所有强者(11)和弱者(00)分别排序
      • 尽量把弱者放在队列前部(先被淘汰)
      • 把强者放在队列后部(更安全)

    这样最大化强者生存概率。


    复杂度分析

    • 二分O(log(maxD))O(\log(\max D)),最多约 3030
    • 单次模拟O(N)O(N)
    • 总复杂度O(Nlog(maxD))O(N \log(\max D)),适合 N105N \leq 10^5

    样例验证

    样例 1

    输入:
    7 3
    5 2
    5 5  
    8 6
    6
    2
    8
    9
    
    二分过程:
    - 检查X=8: 可行(贵族6或8可以留到最后)
    - 检查X=9: 不可行(没有贵族≥9能留到最后)
    - 最终答案:8
    

    样例 2

    输入:
    3 1
    5 3
    5
    5
    
    所有贵族熟练度都是5,答案就是5
    

    样例 3

    输入:
    7 2
    32 4
    27 6
    37
    41
    41
    30
    27
    
    二分找到最大可行值37
    

    总结

    这道题的关键在于:

    1. 二分答案转化:将最大化问题转化为可行性问题
    2. 标记策略:用 1/01/0 表示强者/弱者,简化判断
    3. 贪心排列:弱者先淘汰,强者后淘汰
    4. 精确模拟:按照题目规则实现匹配过程
    • 1

    信息

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