蒟蒻太菜了考场上没想出二分,然后发现暴力跑的很快,于是加了一下玄学的不保证正确性的剪枝,然后就过了,建议加强数据
#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int n,a[100005],sum[100005],Sum[100005];
double ans=1e9;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
for(int i=n;i>=1;i--)Sum[i]=Sum[i+1]+a[i];
if(n<=10000)
{
for(int i=2;i<n;i++)
{
for(int j=i;j<n;j++)
{
double now=(double)(sum[n]-sum[j]+sum[i-1])/(double)(n-j+i-1);
ans=min(ans,now);
}
}
printf("%.3lf",ans);
return 0;
}
for(int i=2;i<n;i+=4)
{
int num=i;
if(a[i]==max(max(a[i],a[i+1]),max(a[i+2],a[i+3])))i=i;
else if(a[i+1]==max(max(a[i],a[i+1]),max(a[i+2],a[i+3])))i=i+1;
else if(a[i+2]==max(max(a[i],a[i+1]),max(a[i+2],a[i+3])))i=i+2;
else if(a[i+3]==max(max(a[i],a[i+1]),max(a[i+2],a[i+3])))i=i+3;
for(int j=i;j<n;j++)
{
double now=(double)(sum[n]-sum[j]+sum[i-1])/(double)(n-j+i-1);
if(n>10000&&(double)Sum[j+1]/(double)(n-j)<now)break;
ans=min(ans,now);
}
i=num;
if(clock()>990000)break;
}
printf("%.3lf",ans);
return 0;
}