做法:構造凸包即可。然後HDU的時間卡的很死,手動輸入,能用儲存位元少的資料類型就用,電腦群組成了剛說過,呵呵。。
#include<cstdio>#define LL __int64const int LMT=100005;int deq[LMT],rear,top;int sum[LMT];int get(void){ char c=getchar(); int res=0; while(c<'0'||c>'9')c=getchar(); while(c>='0'&&c<='9') { res*=10; res+=c-'0'; c=getchar(); } return res;}int main(void){ int i,j,n,k,x; LL help=1; while(~scanf("%d%d",&n,&k)) { double ans=0.0; for(i=1;i<=n;i++) { x=get(); sum[i]=sum[i-1]+x; } rear=top=0; deq[top++]=0; for(i=k;i<=n;i++) { while(rear<top-1) { if(help*(sum[i]-sum[deq[rear]])*(i-deq[rear+1])<=help*(sum[i]-sum[deq[rear+1]])*(i-deq[rear])) rear++; else break; } ans=ans>(sum[i]-sum[deq[rear]])*1.0/(i-deq[rear])?ans:(sum[i]-sum[deq[rear]])*1.0/(i-deq[rear]); j=i-k+1; while(rear<top-1) { if(help*(sum[j]-sum[deq[top-1]])*(deq[top-1]-deq[top-2])< help*(sum[deq[top-1]]-sum[deq[top-2]])*(j-deq[top-1]))top--; else break; } deq[top++]=j; } printf("%.2lf\n",ans); } return 0;}