add new solutions
This commit is contained in:
parent
0c73608ce5
commit
d798d5e8c9
19 changed files with 661 additions and 4 deletions
41
solutions/34/q3453/solution.go
Normal file
41
solutions/34/q3453/solution.go
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
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
|
||||
85
solutions/34/q3454/solution.go
Normal file
85
solutions/34/q3454/solution.go
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
package q3454
|
||||
|
||||
import (
|
||||
"math"
|
||||
"slices"
|
||||
)
|
||||
|
||||
type void struct{}
|
||||
|
||||
func calcLengthAtY(squares [][]int) [][2]int {
|
||||
vertIdx := make([][2]int, len(squares)*2)
|
||||
for i := range squares {
|
||||
vertIdx[i*2] = [2]int{squares[i][1], i}
|
||||
vertIdx[i*2+1] = [2]int{squares[i][1] + squares[i][2], i}
|
||||
}
|
||||
slices.SortFunc(vertIdx, func(a, b [2]int) int { return a[0] - b[0] })
|
||||
|
||||
curSq := map[int]void{}
|
||||
curLenBuf := make([][2]int, len(squares))
|
||||
|
||||
calcLen := func() int {
|
||||
curLen := 0
|
||||
curLenBuf = curLenBuf[:0]
|
||||
for i := range curSq {
|
||||
l := squares[i][0]
|
||||
r := l + squares[i][2]
|
||||
curLenBuf = append(curLenBuf, [2]int{l, r})
|
||||
}
|
||||
slices.SortFunc(curLenBuf, func(a, b [2]int) int { return a[0] - b[0] })
|
||||
r := math.MinInt
|
||||
for i := range curLenBuf {
|
||||
if curLenBuf[i][0] < r {
|
||||
curLen += max(0, curLenBuf[i][1]-r)
|
||||
} else {
|
||||
curLen += curLenBuf[i][1] - curLenBuf[i][0]
|
||||
}
|
||||
r = max(r, curLenBuf[i][1])
|
||||
}
|
||||
return curLen
|
||||
}
|
||||
|
||||
ret := make([][2]int, 0, len(squares)*2)
|
||||
for i := 0; i < len(vertIdx); {
|
||||
curY := vertIdx[i][0]
|
||||
for ; i < len(vertIdx) && vertIdx[i][0] == curY; i++ {
|
||||
sq := vertIdx[i][1]
|
||||
if _, ok := curSq[sq]; ok {
|
||||
delete(curSq, sq)
|
||||
} else {
|
||||
curSq[sq] = void{}
|
||||
}
|
||||
}
|
||||
|
||||
ret = append(ret, [2]int{curY, calcLen()})
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func separateSquares(squares [][]int) float64 {
|
||||
lenAtY := calcLengthAtY(squares)
|
||||
|
||||
totalArea := 0
|
||||
for i := 0; i < len(lenAtY)-1; i++ {
|
||||
totalArea += lenAtY[i][1] * (lenAtY[i+1][0] - lenAtY[i][0])
|
||||
}
|
||||
|
||||
var area int
|
||||
for i := 0; i < len(lenAtY)-1; i++ {
|
||||
y, nextY := lenAtY[i][0], lenAtY[i+1][0]
|
||||
l := lenAtY[i][1]
|
||||
|
||||
areaT := (nextY-y)*l + area
|
||||
switch {
|
||||
case areaT*2 == totalArea:
|
||||
return float64(nextY)
|
||||
case areaT*2 > totalArea:
|
||||
needed := float64(totalArea-area*2) / 2
|
||||
return float64(y) + needed/float64(l)
|
||||
}
|
||||
area = areaT
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
var _ = separateSquares
|
||||
Loading…
Add table
Add a link
Reference in a new issue