var n = len(stations) var sum = make([]int, n) var power = make([]int, n) for i := range n { if i > 0 { sum[i] += sum[i-1] } sum[i] += stations[i] } for i := range n { if i-r-1 >= 0 { power[i] = sum[min(n-1, i+r)] - sum[i-r-1] } else { power[i] = sum[min(n-1, i+r)] } }
funcsub(low int, r int, k int, power []int)bool { var n = len(power) var diff = make([]int, n) for i := range n { if i > 0 { diff[i] = power[i] - power[i-1] } else { diff[i] = power[i] } } sum := 0//用于记录电站当前电量 for i := range n { sum += diff[i] if sum < low { d := low - sum if i+2*r+1 < n { diff[i+2*r+1] -= d } diff[i] += d //可有可无,diff[i]不会再被读取 sum += d k -= d //减少剩余可用电站 if k < 0 { returnfalse } } } returntrue }
funcsub(low int, r int, k int, power []int)bool { var n = len(power) var diff = make([]int, n) for i := range n { if i > 0 { diff[i] = power[i] - power[i-1] } else { diff[i] = power[i] } } sum := 0 for i := range n { sum += diff[i] if sum < low { d := low - sum if i+2*r+1 < n { diff[i+2*r+1] -= d } diff[i] += d sum += d k -= d if k < 0 { returnfalse } } } returntrue }
funcmaxPower(stations []int, r int, k int)int64 { var n = len(stations) var sum = make([]int, n) var power = make([]int, n) for i := range n { if i > 0 { sum[i] += sum[i-1] } sum[i] += stations[i] } minP := math.MaxInt for i := range n { if i-r-1 >= 0 { power[i] = sum[min(n-1, i+r)] - sum[i-r-1] } else { power[i] = sum[min(n-1, i+r)] } minP = min(minP, power[i]) } ret := sort.Search(k+1, func(i int)bool { return !sub(i+minP, r, k, power) }) - 1 + minP returnint64(ret) }