1 条题解

  • 0
    @ 2025-11-11 20:39:25

    问题分析

    我们需要在河流上的 nn 个捕鱼点和 mm 个批发基地之间进行最优决策,最大化净利润。关键约束包括:

    • 捕鱼点有位置 xix_i 和最大捕鱼量 aia_i
    • 批发基地有位置 yjy_j、最大购买量 bjb_j 和收购价格 cjc_j
    • 逆流而上需要燃料费用 pp 卢布/单位距离
    • 必须从河口出发并返回河口

    核心思路

    1. 问题转化与关键观察

    重要洞察:由于必须返回河口,整个行程可以看作是从河口出发,访问一系列捕鱼点和批发基地,最终返回河口。最优策略必然是按位置顺序访问这些点。

    费用计算:逆流而上的燃料成本只与到达的最远位置有关。如果到达位置 dd,总燃料成本为 2×p×d2 \times p \times d(往返)。

    2. 贪心策略

    将捕鱼点和批发基地按位置排序后,从左到右扫描:

    • 在当前位置,我们有一定量的鱼可以出售(来自之前捕鱼点的累计产量)
    • 我们希望在当前位置卖出尽可能多的高价鱼
    • 燃料成本只取决于当前到达的位置

    3. 数据结构优化

    使用树状数组维护批发基地信息:

    • 按价格从低到高建立索引
    • 快速查询:给定目标重量,找到对应的价格分界点
    • 支持:按价格区间统计总重量和总价值

    算法实现

    1. 数据预处理

    将所有捕鱼点和批发基地按位置排序,统一处理。

    2. 扫描过程

    从左到右扫描每个点:

    • 如果是捕鱼点:增加可用鱼量 produce_sum
    • 如果是批发基地:将其加入树状数组(按价格索引)

    3. 利润计算

    在每个位置 xx

    • 如果可用鱼量足够覆盖所有批发需求:直接卖出所有鱼
    • 如果鱼量不足:优先卖出高价鱼,低价鱼可能无法卖出

    利润公式:

    利润 = 卖鱼收入 - 燃料成本
    燃料成本 = p × 当前位置
    

    4. 树状数组操作

    • upd(c, b):在价格 cc 处增加 bb 吨容量
    • get(w):找到重量分界点,使得低价部分的重量刚好为 ww
    • qry(x):查询价格 x\leq x 的所有批发基地的总重量和总价值

    复杂度分析

    • 排序O((n+m)log(n+m))O((n+m)\log(n+m))
    • 扫描过程O((n+m)logC)O((n+m)\log C),其中 CC 是价格范围
    • 总复杂度O((n+m)log(n+m)+(n+m)logC)O((n+m)\log(n+m) + (n+m)\log C)

    算法总结

    本题的解法基于以下几个关键思想:

    1. 顺序扫描:利用位置有序性,将复杂的最优路径问题转化为线性扫描问题
    2. 费用分离:将燃料成本与位置解耦,简化优化目标
    3. 贪心选择:优先卖出高价鱼,确保单位利润最大化
    4. 数据结构:使用树状数组高效维护价格-重量关系,支持快速查询和更新

    核心价值:展示了如何通过问题转化和数据结构优化,将复杂的几何路径问题简化为高效的可计算问题。

    • 1

    信息

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