果断模拟退火,然而因为调参太菜最多只有 86 分,求出大佬/kk
#include"algorithm"
#include"iostream"
#include"cstdio"
#include"ctime"
#include"cmath"
using namespace std;
#define MAXN 100005
#define read(x) scanf("%d",&x)
int n,a[MAXN];
int x,y,L,R;
int l=2,r;
int s[MAXN];
double ans=1000000000000.00;
double t;
inline double check(int l,int r)
{
return (double)(s[n]-s[r]+s[l-1])/(n-r+l-1);
}
inline void SA()
{
double T=13555,delta=0.968,T0=1e-15;
while(T>=T0)
{
L=x+((rand()<<1)-RAND_MAX)*T;
R=y+((rand()<<1)-RAND_MAX)*T;
L=min(L,r),L=max(l,L),R=max(L,R),R=min(R,r);
double op=check(L,R);
if(op<ans) x=L,y=R,ans=op;
else if(rand()<=exp((ans-op)/T)*RAND_MAX) x=L,y=R;
T*=delta;
}
}
inline void work(){while((clock()-t)/CLOCKS_PER_SEC<0.995) SA();}
int main()
{
t=clock();
srand((int)time(0)),srand(19260817),srand((int)time(0));
read(n),r=n-1;
for(register int i=1;i<=n;i++) read(a[i]),s[i]=s[i-1]+a[i];
x=n/3,y=2*n/3;
work();
printf("%.3lf\n",ans);
return 0;
}