J.Average
题目思路
我们根据题目给出的条件可以推出最后的值应该等于
s
u
m
a
x
+
s
u
m
b
y
\frac{sum_a}{x}+\frac{sum_b}{y}
xsuma+ysumb
问题就变成了a数组上找一个长度不小于x的区间最大平均值加上b数组上找一个长度不小于y的区间最大平均值
考虑二分平均值求解。
每次check,先将数组前缀和求出,然后枚举右端点i,并且维护左端点j,保证j<=i-x,并且前缀和最小,最后判断sum[i]-sum[j]的值是否大于等于0。
ac代码
int n,m,x,y;
double a[maxn],b[maxn];
double c[maxn];
bool checka(double xx,double z[],int x,int len)
{
c[0]=0;
for(int i=1;i<=len;i++)
c[i]=z[i]-xx;
for(int i=1;i<=len;i++)
{
c[i]=c[i]+c[i-1];
if(c[i]>0&&i>=x)return 1;
}
double mi=0;
for(int i=x+1;i<=len;i++)
{
mi=min(mi,c[i-x]);
if(c[i]-mi>=eps)
{
return 1;
}
}
return 0;
}
int main()
{
cin>>n>>m>>x>>y;
for(int i=1;i<=n;i++)
{
scanf("%lf",&a[i]);
}
for(int i=1;i<=m;i++)
{
scanf("%lf",&b[i]);
}
double l=0.0,r=1e5;
double ansl=0;
while(r-l>eps)
{
double mid=(r+l)/2;
if(checka(mid,a,x,n))
{
l=mid;
}else
{
r=mid;
}
}
ansl=l;
l=0.0,r=1e5;
double ansr=0;
while(r-l>eps)
{
double mid=(r+l)/2;
if(checka(mid,b,y,m))
{
l=mid;
}else
{
r=mid;
}
}
ansr=l;
printf("%lf\n",ansl+ansr);
return 0;
}