华为OD机试E卷 - 可以处理的最大任务数(Java & Python& JS & C++ & C )

题目描述

在某个项目中有多个任务(用tasks数组表示)需要您进行处理,其中tasks[i]=[si,ei],你可以在si <= day <= ei中的任意一天处理该任务,请返回你可以处理的最大任务数

输入描述

第一行为任务数量n,1 <=n<= 100000。后面n行表示各个任务的开始时间和终止时间,使用si,ei表示,1 <= si <= ei <= 100000

输出描述

输出为一个整数,表示可以处理的最大任务数。

用例

输入

3
1 1
1 2
1 3

输出

3

解题思路

  1. 贪心算法原则:每一步选择当前情况下最优的选择(这里是选择结束时间最早的任务),以达到全局最优解。这种方法适用于任务调度问题,因为优先完成结束时间早的任务可以为后续任务腾出更多时间。

  2. 使用优先队列

    • 优先队列特性:自动根据任务的结束时间进行排序,保证每次取出的都是结束时间最早的任务。
    • 应用:在处理任务时,将所有任务按开始时间存入列表(数组的每个元素是一个列表,对应于该开始时间的所有任务)。然后,遍历每个时间点,将该时间点开始的所有任务加入优先队列。这样,优先队列总是包含当前可执行的任务,且队首是最优先执行的任务。
  3. 任务调度

    • 移除过期任务:在每个时间点,首先检查优先队列中是否有已经结束的任务(即结束时间小于当前时间的任务),将这些任务从队列中移除。这一步确保队列中的任务都是未完成且可执行的。
    • 加入新任务:将当前时间点开始的所有任务加入优先队列。这些任务现在是候选任务,准备被执行。
    • 执行任务:如果优先队列不为空,说明有可执行的任务。从队列中取出(移除)一个任务执行,即完成一个任务,完成任务的计数加一。按照贪心原则,这个任务是当前所有可执行任务中结束时间最早的。
  4. 总结:通过贪心算法选择每一步的最优解(结束时间最早的任务),并利用优先队列自动维护任务的执行顺序,可以有效地解决任务调度问题,最大化完成的任务数量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值