For problem statement at 0-999/600-699/630-639/639/problemE.txt this is a correct solution, but verifier at 0-999/600-699/630-639/639/verifierE.go ends with case 1 failed: expected 1.000000000000 got 1.0000000000
input:2
9 9
6 4
exit status 1 can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
)
type Problem struct {
p int64
t int64
minX int64
maxX int64
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
scanner.Buffer(make([]byte, 1024*1024), 10*1024*1024)
if !scanner.Scan() {
return
}
n, _ := strconv.Atoi(scanner.Text())
probs := make([]Problem, n)
for i := 0; i < n; i++ {
scanner.Scan()
probs[i].p, _ = strconv.ParseInt(scanner.Text(), 10, 64)
}
for i := 0; i < n; i++ {
scanner.Scan()
probs[i].t, _ = strconv.ParseInt(scanner.Text(), 10, 64)
}
sort.Slice(probs, func(i, j int) bool {
return probs[i].p*probs[j].t > probs[j].p*probs[i].t
})
var S int64
for i := 0; i < n; {
j := i
var sumT int64
for j < n && probs[i].p*probs[j].t == probs[j].p*probs[i].t {
sumT += probs[j].t
j++
}
for k := i; k < j; k++ {
probs[k].minX = S + probs[k].t
probs[k].maxX = S + sumT
}
S += sumT
i = j
}
T := S
sort.Slice(probs, func(i, j int) bool {
return probs[i].p < probs[j].p
})
check := func(c float64) bool {
maxV := -1.0
for i := 0; i < n; {
j := i
for j < n && probs[i].p == probs[j].p {
Vmin := float64(probs[j].p) * (1.0 - c*float64(probs[j].maxX)/float64(T))
if Vmin < maxV {
return false
}
j++
}
for k := i; k < j; k++ {
Vmax := float64(probs[k].p) * (1.0 - c*float64(probs[k].minX)/float64(T))
if Vmax > maxV {
maxV = Vmax
}
}
i = j
}
return true
}
left := 0.0
right := 1.0
for iter := 0; iter < 100; iter++ {
mid := (left + right) / 2
if check(mid) {
left = mid
} else {
right = mid
}
}
fmt.Printf("%.10f\n", left)
}