论文题,貌似也没什么好说的
设s[i]为前i个数的前缀和,则
aver[j,i]=s[i]-s[j]/(i-j)
赤果果的斜率,没什么好说的了
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int SIZEN=100005;
int sum[SIZEN];
int q[SIZEN];
double aver[SIZEN];
double getup(int k,int j){
return (double)sum[j]-sum[k];
}
double getdown(int k,int j){
return (double)j-k;
}
void solve(int n,int k){
sum[0]=0;
for(int i=1;i<=n;i++) scanf("%d",&sum[i]);
for(int i=1;i<=n;i++) sum[i]+=sum[i-1];
int head,tail;
double ans=0;
head=tail=0;
q[tail++]=0;
for(int i=k;i<=n;i++){
while(head+1<tail){
double dy1=getup(q[head],i);
double dx1=getdown(q[head],i);
double dy2=getup(q[head+1],i);
double dx2=getdown(q[head+1],i);
if(dy1/dx1<dy2/dx2) head++;
else break;
}
ans=max(getup(q[head],i)/getdown(q[head],i),ans);
if(i<k) continue;
while(head+1<tail){
double dy1=getup(q[tail-2],q[tail-1]);
double dx1=getdown(q[tail-2],q[tail-1]);
double dy2=getup(q[tail-1],i-k+1);
double dx2=getdown(q[tail-1],i-k+1);
if(dy1/dx1>dy2/dx2) tail--;
else break;
}
q[tail++]=i-k+1;
}
printf("%.2lf\n",ans);
}
int main()
{
int i,j;
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
solve(n,k);
}