平均数
题目
解析
发现直接做很麻烦,考虑判定一个答案,发现只需要判定是否>0,于是有显然的线性做法
然后既然有了判定,显然二分答案直接上
code:
#include<cstdio>
#include<iostream>
using namespace std;
inline bool idigit(char x){return (x<'0'|x>'9')?0:1;}
inline int read()
{
int num=0,f=1;
char c=0;
while(!idigit(c=getchar())){if(c=='-')f=-1;}
while(idigit(c))num=(num<<1)+(num<<3)+(c&15),c=getchar();
return num*f;
}
inline void write(int x)
{
int F[20];
int tmp=x>0?x:-x;
if(x<0)putchar('-');
int cnt=0;
while(tmp>0){F[cnt++]=tmp%10+'0';tmp/=10;}
while(cnt>0)putchar(F[--cnt]);
if(x==0)putchar('0');
}
int n,q,a[200010];
double l=-1e6,r=1e6,eps=0.000001,mid,b[200010],s[200010],mn,ans;
bool check(double x)
{
ans=-1e9,mn=1e9;
for(int i=1;i<=n;++i)b[i]=a[i]-x,s[i]=s[i-1]+b[i];
for(int i=q;i<=n;++i)mn=min(mn,s[i-q]),ans=max(ans,s[i]-mn);
return ans>=0;
}
int main()
{
n=read(),q=read();
for(int i=1;i<=n;++i)a[i]=read();
while(l+eps<r)
{
mid=(l+r)/2;
if(check(mid))l=mid;
else r=mid;
}
write((int)(r*1000));
return 0;
}