将每个点依次作为边界,对每个点操作:要么全删左边,要么全删右边,寻最大值,以此求解(具体见代码)
#include<bits/stdc++.h> using namespace std; #define ll long long int const N=1e6+7; int n; ll a[N],b[N],c[N]; //b是前缀和 //c是后缀和 double ans,z1,z2; int main(){ cin >> n; for(int i=1;i<=n;++i){ cin >> a[i]; b[i]=a[i]+b[i-1]; } for(int i=n;i>=1;--i){ c[i]=a[i]+c[i+1]; } for(int i=1;i<=n;++i){ z1= (double) b[i]/i; z2= (double) c[i]/(n-i+1); ans=max(ans,max(z1,z2)); } printf("%.10lf",ans); return 0; }