3296. 移山所需的最少秒数

func minNumberOfSeconds(mountainHeight int, workerTimes []int) int64 {
	l, r := 0, slices.Max(workerTimes) * mountainHeight * (mountainHeight + 1) / 2
	for l <= r {
		mid := l + (r - l) / 2
		if check(mountainHeight, mid, workerTimes) {
			r = mid - 1
		} else {
			l = mid + 1
		}
	}
	return int64(r + 1)
}
 
func check(h, t int, workers []int) bool {
	var cnt int
	for _, worker := range workers {
		l, r := 0, h
		for l <= r {
			mid := l + (r - l) / 2
			cost := worker * mid * (mid + 1) / 2
			if cost <= t {
				l = mid + 1
			} else {
				r = mid - 1
			}
		}
		cnt += (l - 1)
	}
	return cnt >= h
}