MAX Average Problem HDU - 2993 斜率dp fread快读

debug半天,也没找出错误,就是卡fread快读有点恶心,
参考博客https://blog.csdn.net/zyszlb2003/article/details/94427222

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN=100010;
int sum[MAXN];
int a[MAXN];
int q[MAXN];
int read()
{
    int res=0,ch,flag=0;
    if((ch=getchar())=='-')             //判断正负
        flag=1;
    else if(ch>='0'&&ch<='9')           //得到完整的数
        res=ch-'0';
    while((ch=getchar())>='0'&&ch<='9')
        res=res*10+ch-'0';
    return flag?-res:res;
}

//输入外挂
int tot;
const int BUF=25000000;
char Buf[BUF],*buf=Buf;
inline void read(int &a)
{
    for(a=0;*buf<48;buf++);
    while(*buf>47) a=a*10+*buf++-48;
}
inline double calc(int j,int i)
{
	return (double)(sum[i]-sum[j])/(i-j);
}
int n,k;
int main() {
	tot=fread(Buf,1,BUF,stdin);
	while(1) {
//		n=read(),k=read();
		if(buf-Buf+1>=tot) break;
		read(n),read(k);
		sum[0]=0;
		for(int i=1; i<=n; i++) {
//			a[i]=read();
//			sum[i]=sum[i-1]+a[i];
			read(sum[i]);
            sum[i]+=sum[i-1];
		}
		int l=1,r=0;
		q[1]=0;
		double ans=0;
		for(int i=k; i<=n; i++) {
			int j=i-k;
			while(l<r && calc(q[r], q[r-1] ) >=calc(i-k,q[r-1]))
				r--;
			q[++r]=j;
			while(l<r && calc(q[l+1],i)>=calc(q[l],i))
				l++;
			ans=max(ans,1.0*(sum[i]-sum[q[l]])/(i-q[l]) );
		}
		printf("%.2lf\n",ans);
	}
	return 0;
}
posted @ 2020-03-18 13:25  晴屿  阅读(105)  评论(0编辑  收藏  举报