通过率 54% · 提交 428 · 通过 230
小慕接到了N个任务,需要在T个单位时间内完成。,每个任务的处理时间固定为1个单位时间。 每个任务都有限制和对应的报酬,只有在最晚处理时间之前完成任务,才能获得该任务的报酬。 由于可用于处理任务的时间有限,小慕想知道在有限的时间内,最多能获得多少报酬? 1 < N < 100,1 < T < 100
这类题属于华为 OD 机考真题方向中「100分 / 贪心」方向的高频题型,通常考察对「100分 / 贪心」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行输入两个数T和N,表示N个任务和全部任务的最迟的时间节点T。
接下来输入N行,每一行输入两个数K和L表示一个任务,K为这个任务的最晚完成时间,L为完成该任务能够获得的报酬。
一个整数,表示能够获取的最大报酬。
示例 1
输入示例
3 4 1 2 1 3 1 4 2 5
输出示例
9
在单位时间1,完成任务2,获得报酬4 在单位时间2,完成任务3,获得报酬5
示例 2
输入示例
3 5 1 3 2 2 3 1 3 4 4 5
输出示例
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
本题的陷阱在于,每一个任务给定的时间 K 是 最晚完成时间,这意味着该任务可以在小于等于 K 的任意一个时刻完成。
以示例二为例:
如果意识到了这一点,那么以下结论是显而易见的:随着时间增大,某些任务已经错过了其对应的最晚完成时间 K,那么可以选择的任务是变得越来越少的。
难点在于,在当前时间较小的时候,如果我们面临多个选择,我们无法确定应该选择哪个任务。因为我们在做选择时存在两个不同的维度需要考虑:
如果正向地考虑时间变化,我们 没有办法同时保持上述两个维度都满足最优的条件。换句话说,没有办法贪心地从局部最优得到全局最优解。
考虑一种特殊情况,假设仅存在一个任务 i 的最晚完成时间 K 大于等于总体最晚完成时间 T,那么在时刻 T 时,只有这一个任务 i 可以被选择。即使这个任务 i 有可能可以在更早完成,我们也希望 把它拖到时刻 T 来完成,这样才能让时刻 T 之前的单位时间去完成其他任务。
以示例三为例,对于时刻 t = 2,仅存在工作 1 的最晚完成时间是 K = 2,那么工作 1 我们一定希望 把它放在 t = 2 来完成而不是放在 t = 1 来完成,因为这样才能在 t = 1 时刻,去完成更多任务。
所以贪心策略应该是 从后往前考虑时间变化。即时刻 t 从 T 递减变化到 1。
考虑某一个时刻 t,假设该时刻有 m 个可以选择的任务,那么我们会在里面 挑出报酬最大的那个任务 去完成。
在时刻 t-1,除了剩下的 m-1 个任务,还有最晚完成时间 K = t-1 的若干个任务(假设数量为 p)需要放在一起考虑,那么此时一共有 p+m-1 个任务需要考虑,同样在里面 挑出报酬最大的那个任务 去完成。
其中 dic_task_last_t 为一个哈希表,储存了最晚完成时间为时刻 t 的任务的报酬。其:
注意:上述挑选单个时刻里最大值的过程,更好的方法是用一个 最大容量为 T 的优先队列/堆 来维护,这样单个时刻挑选最大值的复杂度可以降为 O(logT)。但因为数据量很小,所以直接排序也是可以通过的。感兴趣的同学可以尝试用优先队列的方法来维护上述过程。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
12
在单位时间1,完成任务0,(最晚完成时间是1),获得报酬3 在单位时间2,完成任务4,(最晚完成时间是4),获得报酬5 在单位时间3,完成任务3,(最晚完成时间是3),获得报酬4
示例 3
输入示例
2 3 1 2 2 5 1 5
输出示例
10
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有