#dxy26005. 最优任务调度

最优任务调度

当前没有测试数据。

题目描述

你有一个单线程处理器和 N 个待处理任务。每个任务 i 有两个参数:

  • tᵢ:处理该任务所需的连续时间(单位时间)。
  • dᵢ:该任务的截止时间(从时刻 0 开始计时)。

规则:

  • 任务一旦开始就不能中断(非抢占式)。
  • 一个任务处理完后,可立即开始下一个任务。
  • 如果任务 i 的完成时间(该任务结束的时刻)≤ dᵢ,则认为该任务按时完成

你可以自由决定任务的执行顺序。目标是最大化按时完成的任务数量

请输出最多可以按时完成的任务数。

输入格式

N
t₁ d₁
t₂ d₂
...
tₙ dₙ
  • 第一行:整数 N(1 ≤ N ≤ 10⁵)
  • 接下来 N 行:每行两个整数 tᵢ 和 dᵢ(1 ≤ tᵢ, dᵢ ≤ 10⁹)

输出格式

一个整数,表示最多能按时完成的任务数量。

样例

样例1:

输入:
3
3 5
2 4
1 3

输出:
2

解释:
按 (t,d) 列出:(3,5), (2,4), (1,3)

策略:先做 (1,3),时刻 1 完成 ≤ 3 ✓
      再做 (2,4),时刻 1+2=3 完成 ≤ 4 ✓
      最后做 (3,5),时刻 3+3=6 完成 > 5 ✗
共完成 2 个。

其他顺序均无法完成超过 2 个:
  先做 (3,5):时刻 3 ≤ 5 ✓,但剩余任务都会超时。
  先做 (2,4):时刻 2 ≤ 4 ✓,再做 (1,3):时刻 3 ≤ 3 ✓,再做 (3,5):时刻 6 > 5 ✗(也是 2 个)。

样例2:

输入:
4
1 2
1 3
2 4
3 7

输出:
4

解释:
按截止时间排序:(1,2), (1,3), (2,4), (3,7)
全部按时完成:
  (1,2): 时刻 1 ≤ 2 ✓, 总时间=1
  (1,3): 时刻 2 ≤ 3 ✓, 总时间=2
  (2,4): 时刻 4 ≤ 4 ✓, 总时间=4
  (3,7): 时刻 7 ≤ 7 ✓, 总时间=7
全部完成,答案为 4。

样例3:

输入:
5
4 5
3 6
2 3
5 10
1 2

输出:
3

解释:
按截止时间排序:(1,2), (2,3), (4,5), (3,6), (5,10)
  (1,2): 总时间=1 ≤ 2 ✓, 堆={1}
  (2,3): 总时间=3 ≤ 3 ✓, 堆={2,1}(最大堆:2,1)
  (4,5): 总时间=7 > 5 ✗, 弹出最大耗时 4, 总时间=3, 堆={2,1}
  (3,6): 总时间=6 ≤ 6 ✓, 堆={3,2,1}
  (5,10):总时间=11 > 10 ✗, 弹出最大耗时 5, 总时间=6, 堆={3,2,1}
最终堆大小 = 3,即完成 3 个任务。

数据范围与约束

参数 范围
N 1 ≤ N ≤ 10⁵
tᵢ, dᵢ 1 ≤ tᵢ, dᵢ ≤ 10⁹
时间复杂度要求 O(N log N)