double res[maxn];
double sum[maxn];
/*
求tmp数组中长度大于等于len的平均值最大的一个区间
时间复杂度 O(nlogn)
*/
double get_avg(int tmp[],int len,int n){
double l = 0,r = 1e5;
while(r - l > 1e-7){
double mid = (l + r)/2;
for(int i = 1;i <= n;i ++){
res[i] = tmp[i] - mid;
}
for(int i = 1;i <= n;i ++){
sum[i] = sum[i - 1] + res[i];
}
double mn = 1e11,mx = -1;
for(int i = len;i <= n;i ++){ //在长度大于等于len的区间内,找到是否有一段的和大于等于 0
mn = min(mn,sum[i - len]); //如果有,说明减去了整个mid也就是枚举的均值,数组仍然满足
mx = max(mx,sum[i] - mn);
}
if(mx >= 0){
l = mid;
}
else r = mid;
}
return r;
}
2021-07-28数组最大平均值
最新推荐文章于 2021-09-19 16:49:30 发布