Problem
题目描述
农场主 John (简称 FJ) 的农场有一长排的 N (1 <= N <= 100,000)块地组成. 每块地有一定数量 (ncows) 的牛, 1 <= ncows <=2000.
FJ 想修建环绕邻接的一组地块的栅栏, 以最大化这组地块中平均每块地中牛的个数.
这组地块必须包含至少 F (1 <= F <= N) 块地, F 作为输入给出.
给定约束, 计算出栅栏的布置情况以最大化平均数.
友情提示:由于本题过于陈旧,数据上有一些偏差,请在解答的时候精度设为"1e-5".
输入格式
第一行: 空格分隔的两个整数, N 和 F.
第2到第N+1行: 每行包含一个整数, 一块地中的牛数. 行 2 给出地块 1 中的牛数, 行 3 给出地块 2 中的牛数, …
输出格式
一行一个整数, 它是最大平均数的 1000 倍.
Solution
这道题的话是一个实数域上的二分答案,主要难点就是实数二分的书写以及如何求解最大平均数。
对于前者,只需要记住大致的一个模板即可。
while (l+eps<r)
{
double mid=(l+r)/2;
if (check(mid)) l=mid;
else r=mid;
}
其中输出的值l和r均可。eps是设置的精度,这里是 1 0 − 5 10^{-5} 10−5
对于后者,也就是这里的check,我们可以这么思考:
- 对于一个平均数大于s的长度为len的序列,其总和 = l e n ∗ s + k , k > 0. =len*s+k,k>0. =len∗s