题面。
const int MAXN=1e6+5;
const double eps=1e-4,INF=1e18;
int n,L;
double a[MAXN],b[MAXN],sum[MAXN];
inline bool check(double x){
for(int i=1;i<=n;i++) b[i]=a[i]-x;
for(int i=1;i<=n;i++) sum[i]=b[i]+sum[i-1];
double mns=INF,ans=-INF;
for(int i=0;i<=i-L-1;i++) mns=min(mns,sum[i]);
for(int i=L;i<=n;i++){
mns=min(mns,sum[i-L]);
ans=max(ans,sum[i]-mns);
}
return (ans>=0)?true:false;
}
signed main()
{
n=read(),L=read();
for(int i=1;i<=n;i++) a[i]=read();
double l=-1e10,r=1e10;
while(fabs(l-r)>eps){
double mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
write(1000*r),puts("");
}
T 飞了,自己随便打了几组好像都挺对的,不知道出了什么问题。
思路和网络上主流的是差不多的。