|
@@ -0,0 +1,39 @@
|
|
|
+type array [][]int
|
|
|
+
|
|
|
+func (a array) Len() int { return len(a) }
|
|
|
+func (a array) Less(i, j int) bool { return a[i][1] < a[j][1] }
|
|
|
+func (a array) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
|
|
+
|
|
|
+type maxHeap []int
|
|
|
+
|
|
|
+func (h maxHeap) Len() int { return len(h) }
|
|
|
+func (h maxHeap) Less(i, j int) bool { return h[j] < h[i] }
|
|
|
+func (h maxHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
|
|
|
+
|
|
|
+func (h *maxHeap) Push(x interface{}) {
|
|
|
+ *h = append(*h, x.(int))
|
|
|
+}
|
|
|
+
|
|
|
+func (h *maxHeap) Pop() interface{} {
|
|
|
+ l := h.Len()
|
|
|
+ x := (*h)[l-1]
|
|
|
+ *h = (*h)[:l-1]
|
|
|
+ return x
|
|
|
+}
|
|
|
+
|
|
|
+func scheduleCourse(courses [][]int) int {
|
|
|
+ sort.Sort(array(courses)) // Sort by the deadlines
|
|
|
+ time, cnt := 0, 0
|
|
|
+ var h maxHeap
|
|
|
+ for _, course := range courses {
|
|
|
+ time += course[0]
|
|
|
+ heap.Push(&h, course[0])
|
|
|
+ cnt++
|
|
|
+ if course[1] < time {
|
|
|
+ cnt-- // If overdue, remove the course that cost the most time
|
|
|
+ x := heap.Pop(&h)
|
|
|
+ time -= x.(int)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return cnt
|
|
|
+}
|