最大均值(二分)

最大均值

解题思路

二分答案
可以将序列中的每个数减去二分的值
题目就变为
是否存在一个长度不小于L,平均值不小于mid的子段

AC代码

#include<cstdio>
#include<algorithm>
using namespace std;
int n,L;
double l=-1000000,r=1000000,a[100005],b[100005],sum[100005];
bool check(double x)//判断
{
   
	for(int i=1;i<=n;i++)b[i]=a[i]-x,sum[i]=sum[i-1]+b[i];
	double ans=-2147483647,mmin=2147483647;
	for(int i=L;i<=n;i++)
	{
   
		mmin=min(mmin,sum[i-L]);
		ans=max(ans,sum[i]-mmin);
	}
	return ans>=0;
}
int main()
{
   
	scanf("%d%d",&n,&L);
	for(int i=1;i<=n;i++)
	 scanf("%lf",&a[i]);
	while(l+1e-5<r)//二分
	{
   
		double mid=(l+r)/2;
		if(check(mid))l=mid;else r=mid;
	}
	printf("%d",int(r*1000));
	return 0;
}

谢谢

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 11:30
找工作7个月,投了7000封,3段世界五百强实习,才有一个offer,牛油们肯定比我强吧
码农索隆:不对不对不对,实习经历这么厉害,简历也没少投,问题出在哪呢
点赞 评论 收藏
分享
强大的马里奥:不太可能,我校计算机硕士就业率99%
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务