Average(牛客暑假训练营第四场)

Average
链接: link.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
大意:
求平均值最大的子矩阵,要求第一行长度至少为 x x x,第二行长度至少为 y y y
题解:(二分+前缀和)

该问题相当于求长度至少为 x x x( y y y)的最大平均值子区间,
s u n [ i ] sun[i] sun[i]累计当前数字与期望平均值( m i d mid mid)的差值,当差值大于0,则说明存在连续子区间满足平均值大于等于该期望平均值,否则则说明期望值较高,通过二分不断确定,最终求出结果
注意: s l o v e slove slove处应使用无返回值得 v o i d void void i n t int int会超时。
代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y;
double ans;
double a[100010];
double sum[100010];
bool check(double mid)
{
	for(int i=1;i<=n;i++)
	{
		sum[i]=sum[i-1]+a[i]-mid; 
	}
	double minn=1e7,anss=-1;
	for(int i=x;i<=n;i++)
	{
		minn=min(minn,sum[i-x]);
		anss=max(anss,sum[i]-minn);
		if(anss-0.0>=1e-7)return 1;
	}
	
	 return 0; 
}
void slove()
{
	double l=0.0,r=1e7,mid;
	while((r-l)>1e-7)
	{
		mid=(l+r)/2;
 		if(check(mid))	l=mid;
 		else	r=mid;
	} 
	ans+=(l+r)/2;
}
int main()
{
	cin>>n>>m>>x>>y;
	for(int i=1;i<=n;i++)scanf("%lf",&a[i]);
	slove();
	n=m;
	x=y;
	for(int i=1;i<=n;i++)scanf("%lf",&a[i]);
	slove();
	printf("%.7lf\n",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值