POJ2018-Best Cow Fences
问题
给定正整数数列A,求一个平均数最大的、长度不小于L的(连续的)子段。
分析
若数列中存在“一段长度不小于 $L$ 且平均数小于等于 $x$ ”的子段时 ,则一定存在“一段长度不小于 $L$ 且平均数小于等于 $y\;(y > x)$ 的子段”,反之也成立。
因此根据问题的单调性可以将问题转化为“二分判定问题”。每次断定二分值 $x$,判断该正整数数列 $A[]$ 中是否存在一段长度不小于 $L$ 且平均数不小于 $x$ 的子段。若存在则增大二分值 $x$,若不存在则减小二分值 $x$。
假设有子段 $A[l…r]$,判定该子段的平均值是否小于 $x$ 则可以判定 $\sum_{i = l}^{r}A[i] \geq (r-l+1)*x$,变换公式可得 $ \sum_{i = l}^{r} \{A[i]-x\} \geq 0$。于是在每次给定 $x$ 进行判定时,我们可以将数列 $A[]$ 中的每一个数都减去 $x$,并求出前缀和 $S[]$。对于每个 $S[i]$ 查找是否存在 $S[j]$ 满足 $S[i] - S[j] \geq 0, \;(0\leq j\leq i-L)$。注意在实数域上进行二分时以及浮点数转整数输出时的注意事项。
代码
1 |
|
Author: Hatton.Liu
Link: http://hattonl.github.io/2020/02/20/best-cow-fences/
License: 知识共享署名-非商业性使用 4.0 国际许可协议