HDU 2993 MAX Average Problem

来源:互联网 发布:最安全的cms 编辑:程序博客网 时间:2024/05/16 05:04
#include <cstdio>#include <algorithm>using namespace std;#define maxn 100005double sum[maxn];int Q[maxn];int head,tail;int GetInt(){    char ch=getchar();    while(ch<'0'||ch>'9')ch=getchar();    int num=0;    while(ch>='0'&&ch<='9'){        num=num*10+ch-'0';        ch=getchar();    }    return num;}bool check1(int i,int j,int k){    if((sum[j]-sum[i])/(double)(j-i)>=(sum[k]-sum[j])/(double)(k-j))  return 1;    return 0;}bool check2(int i,int j,int k){    if((sum[k]-sum[i])/(double)(k-i)<=(sum[k]-sum[j])/(double)(k-j))  return 1;    return 0;}int main(){    int n,k;    while(~scanf("%d%d",&n,&k))    {        int i;        double a;        for(sum[0]=0,i=1;i<=n;i++)        {            a=GetInt();            sum[i]=sum[i-1]+a;        }        double ans=0;        head=tail=0;        for(i=k;i<=n;i++)        {            while(head+1<tail&&check1(Q[tail-2],Q[tail-1],i-k))                tail--;            Q[tail++]=i-k;            while(head+1<tail&&check2(Q[head],Q[head+1],i))                head++;            ans=max(ans,(double)(sum[i]-sum[Q[head]])/(i-Q[head]));        }        printf("%.2lf\n",ans);    }    return 0;}

0 0