#10012. 「一本通 1.2 例 2」Best Cow Fences(浮点数二分模板)

Best Cow Fences

题目描述
原题来自:USACO 2003 Mar. Green

给定一个长度为 n 的非负整数序列 A ,求一个平均数最大的,长度不小于 l 的子段。

输入格式
第一行用空格分隔的两个整数 n 和 l;

第二行为 n个用空格隔开的非负整数,表示Ai 。

输出格式
输出一个整数,表示这个平均数的 1000 倍。不用四舍五入,直接输出。

输入样例:

10 6
6 4 2 10 3 8 5 9 4 1

输出样例:

6500

数据范围与提示:

1<=n<=10^5
0<=ai<=2000

AC代码:解释在代码中

#include<stdio.h>
#include<algorithm>
using namespace std;
double sum[100001];
int n,L,a[100001];
int main()
{
	int i;
	scanf("%d%d",&n,&L);
	for(int i=1; i<=n; i++)
		scanf("%d",&a[i]);
	double l=0,r=2000,eps=1e-5;//l从0开始,r从2000开始,刚好是范围边界
	while(r-l>eps)//因为最后答案乘以1000,所以我们要保留5位小数,就是eps=1e-5
	{
		double mid=(l+r)/2.0;//mid就代表我们要找的平均值
		for(i=1; i<=n; i++)
			sum[i]=sum[i-1]+a[i]-mid;//sum[i]代表的含义是前i项的每一项减去平均值的和
		double ans=-1e10,min_v=1e10;//如果sum[i]==0就代表mid刚好是前i个数的平均值,如果>0即mid太小,要找mid右边的区间。
		for(i=L; i<=n; i++)
		{
			min_v=min(min_v,sum[i-L]);//找到最小值
			ans=max(ans,sum[i]-min_v);//减去最小值可以使平均数变大
		}
		if(ans>=0)
			l=mid;
		else
			r=mid;
	}
	printf("%d\n",(int)(r*1000));//因为不用四舍五入,所以我们直接强制转换
}//printf("%.0lf\n",r*1000);这样交上去会报错,因为这样就四舍五入了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值