二分1:最佳牛围栏
作者:
总打瞌睡的天天啊
,
2024-08-05 12:38:54
,
所有人可见
,
阅读 1
//二分真的是太神奇了
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=100010;
double a[N],s[N];
int n,f;
bool check(double avg)
{
for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i]-avg;
//看平均值是否可以变大,可以减去平均值,看序列和是否大于零
double mins=0;
for(int k=f;k<=n;k++)//规定右端点为k
{
mins=min(mins,s[k-f]);//算从s[0~n-f]的最小值
if(s[k]-mins>=0)return true;//即f到k序列之和大于零
}
return false;
}
int main()
{
cin>>n>>f;
double l=0,r=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
r=max(r,a[i]);//平均值范围从l到r
}
while(r-l>1e-5)
{
double mid=(l+r)/2;
if(check(mid))l=mid;//如果这个mid存在,更新平均值范围从mid到r
else r=mid;//否则跟新更新平均值范围从l到mid
}
printf("%d\n",int(r*1000));
return 0;
}
// int main()
// {
// int m,n;
// cin>>m>>n;
// for(int i=1;i<=m;i++)cin>>a[i];
// for(int i=1;i<=m;i++)s[i]=s[i-1]+a[i];
// int res=0;
// for(int i=n;i<=m;i++)
// for(int j=i;j<=m;j++)
// res=max(res,(s[j]-s[j-i])*1000/i);
// cout<<res<<endl;
// }