华为 · 贪心 · 算法编程题
华为 贪心 N ≤ 1e5 时限 3 秒 / 256 MB

题目描述

在星际纪元 2333 年,您是“星尘港务局”最先进的交通调度AI。
您负责管理银河系中最繁忙的垂直太空港——“天穹站”。
空间站从上到下共分为 F 个停泊层级,每个层级都配备了 M 个标准化的无人对接泊位。
每天,数以万计的星舰涌入“天穹站”的管辖空域,提交停泊申请。
您的核心任务是以最低的能源消耗,最高效地为这些星舰分配泊位。
星舰的停泊规则非常特殊:
停泊分配 :每艘星舰 i 的申请中会包含一个 首选停泊层级 R_i 和一个 船员人数 P_i 。根据空间站的设计,星舰只能被安排在其首选层级 R_i 或 其下方的任意层级(直至最底部的1层)。
能源消耗计算 :为一次停泊分配计算总能耗是您的关键绩效指标(KPI)。总能耗由两部分构成:
1. 基础能耗 :无论在哪一层停泊,仅对接过程本身就需要消耗 2 个单位的能量。
2. 调度能耗 :如果一艘星舰被安排在低于其首选层级的位置,为了转运船员和货物,每向下一层,就需要额外消耗 1 个单位的能量。
总能耗公式 :对于一艘首选层级为 R_i ,最终停在 A_i 层 ( A_i ≤ R_i ),载有 P_i 名船员的星舰,其单次任务能耗为: P_i × (2 + (R_i - A_i)) 。
任务目标 :您的目标是为所有 N 艘申请的星舰找到一个停泊方案,使得 总能耗(所有星舰的能耗之和)达到最小值。
异常情况 :如果泊位总数不足以容纳所有申请的星舰,调度计划无法完成,此时应报告异常,输出 -1 。

输入输出

输入描述
第一行包含三个整数 F, M, N 。
F :空间站的总层级数 ( 1 ≤ F ≤ 1000 )。
M :每层的泊位数 ( 1 ≤ M ≤ 100 )。
N :总共收到的星舰停泊申请数 ( 1 ≤ N ≤ 100000 )。
接下来 N 行,每行包含两个整数 R_i, P_i 。
R_i :第 i 艘星舰的首选停泊层级 ( 1 ≤ R_i ≤ F )。
P_i :第 i 艘星舰的船员人数 ( 1 ≤ P_i ≤ 50 )。
输出描述
输出一个整数,表示能够实现的最低总能耗。
如果无法为所有星舰安排泊位,则输出 -1 。

样例共 2 组

样例 1
输入
3 3 4
2 20
1 10
2 10
2 10
输出
100
样例 2
输入
1 1 2
1 10
1 20
输出
-1

算法解析依据充分

考点:贪心

数据规模 N ≤ 1e5 | 限制 3 秒 / 256MB | 标准输入输出

题目画像

  • 数据规模:N ≤ 1e5,M ≤ 100
  • 元素值域:F ≤ 1e3,P_i ≤ 50(注意整数类型选择,避免溢出)
  • 复杂度门槛:只允许 O(n log n) 及更优,朴素 O(n²) 会超时。
  • 源站时限:3 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:贪心

本题切入点

从最高层往低层分配:同一层内优先安排 P_i 大的星舰(每向下一层每人多消耗 1),借助堆/有序结构按 R_i 逐层处理可得最小总能耗;泊位不足则 −1。

每一步都取当前最优,靠问题性质保证局部最优能拼成全局最优。

思路框架(贪心 通法 · 非本题专属)

  1. 找出「局部最优怎么选」(往往与排序后的顺序有关)。
  2. 论证(或理性相信)这个贪心策略不会被反例击破:常用交换论证法。
  3. 按策略一次扫描(通常要先排序)得到答案。
  4. 若贪心无法证明,考虑改用 DP(贪心的反例通常来自「当前最优影响后续选择」)。

实现要点:贪心题关键在于排序规则:按什么关键字排序决定了策略是否正确。

复杂度:时间 O(n log n)(含排序) | 空间 O(1) ~ O(n)

该范式的通法易错点

  • 策略不成立却当成贪心做(典型错因)。
  • 排序关键字选错,或相同关键字时的次级规则没考虑。

对照本题

  • 数据规模 N ≤ 1e5,只允许 O(n log n) 及更优,朴素 O(n²) 会超时。
  • 元素值域最大到 1e3 —— 求和 / 相乘时记得开 64 位整数。

样例

样例 1

  • 输入:3 3 4 / 2 20 / 1 10 / 2 10 / 2 10
  • 输出:100

样例 2

  • 输入:1 1 2 / 1 10 / 1 20
  • 输出:-1

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2025年秋招-华为-11月05号开发岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解