add new solutions
This commit is contained in:
parent
e1b702657c
commit
59b71480d4
11 changed files with 343 additions and 0 deletions
77
solutions/24/q2402/solution.go
Normal file
77
solutions/24/q2402/solution.go
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue