← Home
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)
}