go: add «502. IPO»

Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
Matej Focko 2024-06-15 20:22:47 +02:00
parent d18212e90f
commit e2b6b15847
Signed by: mfocko
GPG key ID: 7C47D46246790496

53
go/ipo.go Normal file
View file

@ -0,0 +1,53 @@
package ipo
import (
"cmp"
"slices"
pq "github.com/emirpasic/gods/v2/queues/priorityqueue"
)
type Project struct {
capital int
profit int
}
func byCapital(a, b Project) int {
return cmp.Compare(a.capital, b.capital)
}
func revCmp[T cmp.Ordered](x, y T) int {
return -cmp.Compare(x, y)
}
func findMaximizedCapital(k int, w int, profits []int, capital []int) int {
// construct the list of projects
projects := make([]Project, len(profits))
for i, _ := range profits {
projects[i] = Project{capital: capital[i], profit: profits[i]}
}
slices.SortFunc(projects, byCapital)
queue := pq.NewWith[int](revCmp)
i := 0
for range k {
// add the affordable projects to the queue
for i < len(projects) && projects[i].capital <= w {
queue.Enqueue(projects[i].profit)
i++
}
// invest into the currently most profitable project
profit, ok := queue.Dequeue()
if !ok {
// ran out of the available projects
break
}
// collect the profit
w += profit
}
return w
}