【Ybtoj 第3章 例题3】最大均值【二分】

博客介绍了一道题的解题思路,需二分一个平均值,对于小数二分,定义l、r、mid为double类型并加eps控制迭代精度。判断二分到的平均值是否满足条件复杂度为O(n2)会超时,采用前缀和优化,通过让当前区间的sumi - j + 1最小来得到较优答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


解题思路

这道题显然需要二分一个平均值,
问题是小数怎么二分呢?
我们可以定义l,r,midl , r , m i dl,r,middoubledoubledouble类型,
并在判断时加上一个epsepseps即可。(epsepseps是在函数程序中事先声明的常量,是控制迭代精度的,相当于微积分里面的无限小值)

这个问题解决了,我们发现还有一个问题:
判断当前二分到的平均值是否满足条件是 O(n2)O(n^2)O(n2),会超时。
首先想到前缀和优化。
此时判断区间为 max(sumi−sumi−j+1)max(sum_i-sum_{i-j+1})max(sumisumij+1)(l<i≤n,j≤i−l)(l<i≤n,j≤i−l)(l<in,jil)
不难发现 j 只会在 111~ i−li − lil 中循环比较,直接 max ⁡ 即可,可以省掉一个for循环。
然后注意让当前区间的 sumi−j+1sum_{i-j+1}sumij+1最小即可得到较优答案。


代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const double eps=1e-5;
int n,k;
double l,r,mid,sum[200000],a[200000];

bool check(double lyx)
{
	for(int i=1;i<=n;i++)
		sum[i]=sum[i-1]+a[i]-lyx;//求出前缀和(序列和减去mid)
	double mann=2147483600,ans=-2147483600;
	for(int i=k;i<=n;i++)//省去j的循环
	{
		mann=min(mann,sum[i-k]);
		ans=max(ans,sum[i]-mann);
	}
	if(ans>=0)return 1;
	else return 0;
}

int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
		scanf("%lf",&a[i]);
	l=-1e6,r=1e6;
	while(l+eps<r)
	{
		mid=(l+r)/2;
		if(check(mid))
			l=mid;
		else r=mid;
	}
	cout<<int(r*1000);
} 
资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 最近在使用 MongoDB 3.0.6 版本时,小编遇到了一个棘手的问题:在对集合执行大规模排序操作(如聚合)时,出现了错误提示。今天就来分享一下如何快速解决 MongoDB 排序操作超出内存限制的问题。 MongoDB 是一款广受欢迎的开源文档型数据库,凭借其出色的性能、高可用性和可扩展性而备受青睐。但在处理海量数据集时,尤其是涉及排序操作时,很容易碰到内存限制的瓶颈。MongoDB 在执行排序操作时,默认会使用内存来完成,以保证操作的高效性。不过,为了防止过度占用系统资源,MongoDB 对内存中的排序操作设置了上限,通常为 100MB(在 3.0.6 版本中)。一旦排序的数据量超出了这个限制,就会出现类似以下的错误: 该错误表明,排序操作超出了 100MB 的内存限制,且未启用外部排序功能。为了解决这一问题,可以使用allowDiskUse选项。allowDiskUse允许 MongoDB 在排序时借助磁盘空间,而不再仅依赖内存。具体操作是在聚合查询或排序操作中加入{allowDiskUse: true}。例如,针对上述错误,可以将查询语句修改为: 启用allowDiskUse后,MongoDB 会将排序数据写入临时文件,并在磁盘上完成排序。虽然这种方式可能会因磁盘 I/O 的延迟而降低排序速度,但它能够有效处理大规模数据集。 不过,需要注意的是,虽然allowDiskUse可以解决内存限制问题,但其对性能的影响也不容忽视。在处理大量数据时,建议优化查询语句,减少需要排序的文档数量,或者考虑采用其他数据存储和查询策略,比如分片(sharding)或预计算索引等。此外,保持数据库版本的更新也非常重要。MongoDB 的后续版本可能在内存管理和排序机制方面进行了优化,例如提升了内存限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值