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