算法:二分加前缀和
题解:二分查找最大平均值,f函数判断当前平均值mid是否合适,数组元素减去x,求前缀和sum,从sum[k]遍历,mi中存前面的最小值。
点击查看代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N=3e5+7;
double a[N],sum[N];
int n,k;
bool f(double mid)
{
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+a[i]-mid;
}
double mi=0;
for(int i=k;i<=n;i++)
{
if(sum[i]-mi>0) return true;
mi=min(mi,sum[i-k+1]);
}
return false;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
double ans=0;
double l=0,r=1e6;
while(r-l>1e-6)
{
double mid=(r+l)/2.0;
if(f(mid)) l=mid;
else
{
r=mid;
}
}
cout<<l<<"\n";
return 0;
}