思路:
首先二分答案,然后将每个数都减去这个平均值,然后做一遍前缀和,这时维护一个min,使它长度合法,然后一减判断是否大于0
c o d e code code
#include<iostream>
#include<cstdio>
using namespace std;
int n, k;
double b[1001000], a[1010000], ans;
bool check(double m)
{
for(int i=1; i<=n; i++)
b[i]=b[i-1]+a[i]-m;
double minn=1000000.0;
for(int i=1; i<=n; i++)
{
if(i-k+1>=1)
{
minn=min(minn, b[i-k]);
if(b[i]-minn>=0)
return 1;
}
}
return 0;
}
int main()
{
freopen("average.in", "r", stdin);
freopen("average.out", "w", stdout);
scanf("%d%d", &n, &k);
for(int i=1; i<=n; i++)
scanf("%lf", &a[i]);
double l=0.0, r=1000000.0;
while(l+0.0000001<r)
{
double mid=(l+r)/2.0;
if(check(mid))
l=mid, ans=mid;
else
r=mid;
}
printf("%.7lf", ans);
return 0;
}