【二分·习题】Best Cow Fence(实数域上的二分答案)

该博客介绍了农场主John想要建造一个环绕邻接地的栅栏,以最大化地块中平均每块地的牛数。给定地块上的牛数和必须包含的地块数,需要找到能最大化平均牛数的解决方案。这是一个实数域上的二分查找问题,博客详细阐述了解题思路,包括实数二分模板和检查最大平均数的方法,以及如何在O(n)时间内完成检查。
摘要由CSDN通过智能技术生成

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} 105

对于后者,也就是这里的check,我们可以这么思考:

  • 对于一个平均数大于s的长度为len的序列,其总和 = l e n ∗ s + k , k &gt; 0. =len*s+k,k&gt;0. =lens
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值