Sắp xếp công việc có thời hạn

Xem dạng PDF

Gửi bài giải

Điểm: 600,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Nguồn bài:
HungTV
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Có ~N~ công việc khác nhau đang chờ bạn thực hiện. Công việc thứ ~i~ có thời hạn hoàn thành (deadline) là ~D_i~ và nếu hoàn thành đúng hạn, bạn sẽ nhận được mức lợi nhuận là ~P_i~.

Mỗi công việc đều tiêu tốn chính xác 1 đơn vị thời gian để hoàn thành. Bạn chỉ có thể làm một công việc tại một thời điểm, và bắt đầu công việc đầu tiên ở thời điểm ~t = 0~. Một công việc được gọi là hoàn thành đúng hạn nếu thời điểm nó hoàn thành nhỏ hơn hoặc bằng ~D_i~.

Hãy tìm cách chọn và sắp xếp các công việc sao cho tổng lợi nhuận thu được là lớn nhất có thể.

Dữ liệu

  • Dòng đầu tiên chứa số nguyên dương ~N~ (~1 \le N \le 10^5~).
  • ~N~ dòng tiếp theo, mỗi dòng chứa hai số nguyên ~D_i~ và ~P_i~ (~1 \le D_i \le 10^5~, ~1 \le P_i \le 10^9~), cách nhau bởi khoảng trắng.

Kết quả

In ra một số nguyên duy nhất là tổng lợi nhuận tối đa bạn có thể thu được. (Lưu ý: Kết quả có thể vượt quá giới hạn số nguyên 32-bit).

Ví dụ

Input
5
2 100
1 19
2 27
1 25
3 15
Output
142
Giải thích

Có 5 công việc. Các công việc được chọn để thực hiện là:

  • Thời gian 0 -> 1: Làm công việc 4 (Deadline = 1, Profit = 25).
  • Thời gian 1 -> 2: Làm công việc 1 (Deadline = 2, Profit = 100).
  • Thời gian 2 -> 3: Làm công việc 5 (Deadline = 3, Profit = 15). Tổng lợi nhuận: ~25 + 100 + 15 = 140~. Khoan đã, nếu bỏ công việc 5, làm công việc 3 (Profit = 27) thay vào vị trí công việc 4 thì sao? Cách tối ưu thực sự:
  • 0 -> 1: Làm công việc 3 (Deadline = 2, Profit = 27).
  • 1 -> 2: Làm công việc 1 (Deadline = 2, Profit = 100).
  • 2 -> 3: Làm công việc 5 (Deadline = 3, Profit = 15). Tổng lợi nhuận = ~27 + 100 + 15 = 142~. (Các công việc 1 và 3 đều có deadline là 2 nên ta phải làm chúng trong 2 giờ đầu tiên).

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.