记录编号 118949 评测结果 AAAAAAAAAA
题目名称 [USACO Mar03]最大平均值 最终得分 100
用户昵称 GravatarChenyao2333 是否通过 通过
代码语言 C++ 运行时间 0.156 s
提交时间 2014-09-10 09:31:03 内存使用 0.75 MiB
显示代码纯文本
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<string.h>

using namespace std;
const int MAXN=1e5+10;
const double INF=1e8;

int N,K;

int num[MAXN],sum[MAXN];

void init(){
	memset(num,0,sizeof(num));
	memset(sum,0,sizeof(sum));
	for(int i=1;i<=N;i++)scanf("%d",&num[i]),sum[i]=num[i]+sum[i-1];
}

double cal_k(int x1,int x2){
	return double(sum[x2]-sum[x1])/double(x2-x1);
}
void work(){
	deque<int> q;
	double ans=-INF;
	for(int i=K-1;i<=N;i++){
		int x3=i;
		double tmp=-INF;
		bool first=true;
		while(!q.empty()){
			int tx;
			if(!first && q.size()<2)break;
			if(!first)tx=q.front(),q.pop_front();
			int x1=q.front();
			double tt=cal_k(x1,x3);
			if(tt>tmp){
				tmp=tt;
			}else if(!first){
				q.push_front(tx);
				break;
			}
			first=false;
		}
		if(q.size()==1){
			int tx=q.front();
			tmp=max(tmp,cal_k(tx,x3));
		}
		ans=max(ans,tmp);
		
		bool ok=false;
		x3=i-(K-1);
		while(q.size()>=2){
			int x1,x2;
			x2=q.back();q.pop_back();
			x1=q.back();
			
			double k1=cal_k(x1,x2);
			double k2=cal_k(x2,x3);
			if(k2>k1){
				q.push_back(x2);
				q.push_back(x3);
				ok=true;
				break;
			}
		}
		if(!ok)q.push_back(x3);
	}
	printf("%d\n",int(ans*1000));
}

int main(){
	freopen("avanum.in","r",stdin);
	freopen("avanum.out","w",stdout);
	while(scanf("%d %d",&N,&K)==2){
		init();
		work();
	}
	return 0;
}