poj 2018 斜率DP 求子序列的最大平均值

#include<cstdio>
#include<cstring>
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MIN(x,y) ((x)>(y)?(y):(x))
struct node
{
	double x,y;
}q[100100];
double cal(double x1,double y1,double x2,double y2)
{
	return  (y1-y2)/(x1-x2); 
}
double sum[100100]; 
int main()
{
	int n,f;
	scanf("%d%d",&n,&f);
	memset(sum,0,sizeof(sum)); 
	for(int i=1;i<=n;i++)
	{
	  scanf("%lf",&sum[i]);
	  sum[i]+=sum[i-1];
    }
    q[0].x=0;q[0].y=0;
    int head=0,tot=0; 
    double ans=-1; 
    for(int i=1;i<=n;i++)
    { 
    	while(head<=tot&&q[head].x+f<=i)
    	head++;
    	if(head>0) 
    	{
		  ans=MAX(ans,(sum[i]-q[head-1].y)/(i-q[head-1].x));		  
	    }
    	while(head<tot&&cal(q[tot].x,q[tot].y,q[tot-1].x,q[tot-1].y)>cal(i,sum[i],q[tot].x,q[tot].y))
    	tot--;
    	q[++tot].x=i;
    	q[tot].y=sum[i];
	} 
	printf("%d\n",(int)(ans*1000));
	return 0; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值