41 lines
706 B
Go
41 lines
706 B
Go
package q3453
|
|
|
|
import (
|
|
"math"
|
|
"slices"
|
|
)
|
|
|
|
func separateSquares(squares [][]int) float64 {
|
|
slices.SortFunc(squares, func(a, b []int) int { return a[1] - b[1] })
|
|
var totalArea float64
|
|
var maxY int
|
|
for i := range squares {
|
|
totalArea += math.Pow(float64(squares[i][2]), 2)
|
|
maxY = max(maxY, squares[i][1]+squares[i][2])
|
|
}
|
|
|
|
target := totalArea / 2
|
|
|
|
// Binary search
|
|
var l, r float64 = 0, float64(maxY)
|
|
for range 64 {
|
|
m := (l + r) / 2
|
|
|
|
var area float64
|
|
for i := range squares {
|
|
y, l := float64(squares[i][1]), float64(squares[i][2])
|
|
if y >= m {
|
|
break
|
|
}
|
|
area += l * min(l, m-y)
|
|
}
|
|
if area < target {
|
|
l = m
|
|
} else {
|
|
r = m
|
|
}
|
|
}
|
|
return l
|
|
}
|
|
|
|
var _ = separateSquares
|