77 lines
1.6 KiB
Go
77 lines
1.6 KiB
Go
package q2402
|
|
|
|
import (
|
|
"container/heap"
|
|
"slices"
|
|
)
|
|
|
|
type Room struct {
|
|
id int
|
|
meetingStart int
|
|
meetingEnd int
|
|
}
|
|
|
|
type Rooms []Room
|
|
|
|
func (r *Rooms) Len() int { return len(*r) }
|
|
func (r *Rooms) Push(x any) { (*r) = append((*r), x.(Room)) }
|
|
func (r *Rooms) Swap(i int, j int) { (*r)[i], (*r)[j] = (*r)[j], (*r)[i] }
|
|
|
|
func (r *Rooms) Less(i int, j int) bool {
|
|
if (*r)[i].meetingEnd == (*r)[j].meetingEnd {
|
|
return (*r)[i].id < (*r)[j].id
|
|
}
|
|
return (*r)[i].meetingEnd < (*r)[j].meetingEnd
|
|
}
|
|
|
|
func (r *Rooms) Pop() any {
|
|
last := len(*r) - 1
|
|
ret := (*r)[last]
|
|
*r = (*r)[:last]
|
|
return ret
|
|
}
|
|
|
|
func mostBooked(n int, meetings [][]int) int {
|
|
timesBooked := make([]int, n)
|
|
empty := make(Rooms, n)
|
|
for i := range empty {
|
|
empty[i] = Room{id: i}
|
|
}
|
|
inUse := make(Rooms, 0, n)
|
|
|
|
slices.SortFunc(meetings, func(a, b []int) int { return a[0] - b[0] })
|
|
for i := range meetings {
|
|
start, end := meetings[i][0], meetings[i][1]
|
|
for len(inUse) > 0 && inUse[0].meetingEnd <= start {
|
|
heap.Push(&empty, Room{id: inUse[0].id})
|
|
heap.Pop(&inUse)
|
|
}
|
|
|
|
if len(empty) > 0 {
|
|
id := empty[0].id
|
|
timesBooked[id]++
|
|
heap.Push(&inUse, Room{
|
|
id: id,
|
|
meetingStart: start,
|
|
meetingEnd: end,
|
|
})
|
|
heap.Pop(&empty)
|
|
} else {
|
|
room := &inUse[0]
|
|
timesBooked[room.id]++
|
|
room.meetingStart, room.meetingEnd = room.meetingEnd, end-start+room.meetingEnd
|
|
heap.Fix(&inUse, 0)
|
|
}
|
|
}
|
|
|
|
mb, mbIdx := timesBooked[0], 0
|
|
for i := 1; i < len(timesBooked); i++ {
|
|
if timesBooked[i] > mb {
|
|
mb, mbIdx = timesBooked[i], i
|
|
}
|
|
}
|
|
return mbIdx
|
|
}
|
|
|
|
var _ heap.Interface = &Rooms{}
|
|
var _ = mostBooked
|