题意

给出v,x,y

求一个最小的t满足 y/(v+x*t) + t 最小

思路

v,x,y都是已知的,那么这个式子可以转化为 m1/(m2+m3*t) + t

比如样例的话实际上就是y=2/x+x,其中x>=0,这是一个凹函数,先下降再上升,可以用三分来求极值

Go代码

package main

import (
	"fmt"
)

func main() {
	var v, x, y float64
	fmt.Scan(&v, &x, &y)
	var l, r float64 = 0.0, 1_000_000_000
	cul := func(x,y,v, t float64) float64 {
		return y/(v+x*t) + t
	}
	for r-l >= 1e-7 {
		tmp := (r - l) / 3.0
		mid1, mid2 := l+tmp, l+2*tmp
		res1, res2 := cul(x,y, v, mid1), cul(x,y, v, mid2)
		if res1 >= res2 {
			l = mid1
		} else {
			r = mid2
		}
	}
	fmt.Println(cul(x,y, v, l))
}