每日題。有點像是1353. maximum number of events that can be attended

題目

有n個不同的課程,編號從1到n。輸入陣列courses,其中courses[i] = [durationi, lastDayi]表示第i門課需要連續占用durationi天,且最慢必須在lasyDayi天完成。

從第1天開始,每次只能修一門課,求最多總共可以修完幾門課。

解法

每堂課都有設定最後期限,先不論耗時幾天,先選擇截止日期較接近的課程總是更佳選擇,故先將courses以截止日期遞增排序。

維護變數today,代表當前的日期,以及最大堆積h,儲存已選的課程。
遍歷排序好的courses,其耗時為cost,截止日期為last,而day加上cost就是最後一天上課日。
如果最後一天上課日會超出截止日,則必須退掉一堂課。既然要退就退掉已選課程h中耗時最久者,可以替未來空出更多時間。
最後回傳h大小就是已選修的課程數。

class Solution:
    def scheduleCourse(self, courses: List[List[int]]) -> int:
        courses.sort(key=itemgetter(1))
        h=[]
        today=0
        for cost,last in courses:
            today+=cost
            heappush(h,-cost)
            if today>last:
                drop=-heappop(h)
                today-=drop
                
        return len(h)