没有使用二分的一种奇怪做法,证明做法假了也行
#include<bits/stdc++.h>
using namespace std;
int n,l=1,r;
double ans;
double a[100005];
double s[100005],s2[100005];
int main(){
//freopen("P2115_2.in","r",stdin);
cin>>n;r=n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
for(int i=n;i>=1;i--) s2[i]=s2[i+1]+a[i];
for(int i=2;i<=n;i++){
if((s[i]*1.0/double(i*1.0))<(s[l]*1.0/double(l*1.0))) l=i;
}
for(int i=n-1;i>l;i--){
if((s2[i]*1.0/double((n-i+1)*1.0))<(s2[r]*1.0/double((n-r+1)*1.0))) r=i;
}
if(l+1<r){
ans=(s[l]+s2[r])/double(l+n-r+1);
}
else{
double maxn=-1;
for(int i=2;i<n;i++) maxn=max(maxn,a[i]);
ans=(s[n]-maxn)*1.0/double((n-1)*1.0);
}
printf("%.3lf",ans);
return 0;
}
思路是算最小前缀和和最小后缀和,35pts