Cho hai danh sách deadlines và credits cùng kích thước, đại diện cho các bài tập. deadlines[i] là ngày hạn nộp, credits[i] là tín chỉ nhận được. Mỗi bài tập mất 1 ngày, phải hoàn thành vào hoặc trước ngày hạn. Không thể làm nhiều bài cùng lúc. Tìm tổng tín chỉ lớn nhất có thể đạt được.
Ví dụ: deadlines = [1, 2, 2, 2], credits = [4, 5, 6, 7] → kết quả 18 (làm bài 5 ngày 0, bài 6 ngày 1, bài 7 ngày 2).
Giải thuật
- Ghép cặp
(deadline, credit)và sắp xếp giảm dần theocredit. - Tạo mảng
reskích thướcmax(deadlines)+1đánh dấu ngày đã dùng. - Duyệt từng cặp
(i, j)(deadline, credit): từ ngàyigiảm về 0, tìm ngày trống đầu tiên, đánh dấu và cộng tín chỉ. - Trả về tổng tín chỉ.
Ví dụ minh họa
class Solution:
def solve(self, deadlines, credits):
a = sorted(list(zip(deadlines, credits)), key=lambda x: x[1], reverse=True)
if not a:
return 0
res = [0] * (max(deadlines) + 1)
ans = 0
for i, j in a:
for k in range(i, -1, -1):
if not res[k]:
res[k] = 1
ans += j
break
return ans
ob = Solution()
deadlines = [1, 2, 2, 2]
credits = [4, 5, 6, 7]
print(ob.solve(deadlines, credits))
Đầu vào
[1, 2, 2, 2], [4, 5, 6, 7]
Đầu ra
18