用类似于求最大子段和的贪心思想
从1往后枚举,如果加上当前点不如从k个点前开始,那么就换成从前k个点开始,否则就往下加
WA了11点
expected 492.8991597
found 492.8850000
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
inline void read(int &x)
{
x=0;bool t=false;char c=getchar();
while(c<'0'||c>'9')c=='-'?t=1:0,c=getchar();
while(c>='0'&&c<='9')x=x*10+(c&15),c=getchar();
t?x=-x:x;
}
int n,k;
int a[N];
ll sum[N];
int main()
{
// freopen("average.in","r",stdin);
// freopen("average.out","w",stdout);
read(n);read(k);
for(int i=1;i<=n;i++)
read(a[i]),sum[i]=sum[i-1]+a[i];//前缀和求平均值
long double ans=0;
int ave=1;//ave表示区间起点
for(int i=k;i<=n;++i)
{
long double now=1.0000000000000000*(sum[i]-sum[ave-1])/(i-ave+1);
long double change=1.00000000000000000*(sum[i]-sum[i-k])/k;
if(now<change)
{
ave=i-k+1;
now=change;
}
ans=max(ans,now);
}
cout<<fixed<<setprecision(15)<<ans<<endl;
return 0;
}//从1往后枚举,如果加上当前点不如从k个点前开始,那么就换成从前k个点开始,否则就往下加