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:
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