码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 2993 MAX Average Problem(斜率DP入门题)

时间:2016-12-05 14:10:56      阅读:338      评论:0      收藏:0      [点我收藏+]

标签:include   double   int   show   stdin   space   输入   namespace   ref   

题目链接:hdu 2993 MAX Average Problem

题意:

给一个长度为 n 的序列,找出长度 >= k 的平均值最大的连续子序列。

题解:

这题是论文的原题,请参照2004集训队论文《周源--浅谈数形结合思想在信息学竞赛中的应用》

这题输入有点大,要加读入优化才能过。

技术分享
 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 
 5 int tot;
 6 const int BUF=25000000;
 7 char Buf[BUF],*buf=Buf;
 8 inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
 9 
10 const int N=1e5+7;
11 int sum[N],Q[N],n,k;
12 
13 inline int useless(int a,int b,int c)
14 {
15     return 1ll*(sum[c]-sum[b])*(b-a)<=1ll*(sum[b]-sum[a])*(c-b);
16 }
17 
18 int main()
19 {
20     tot=fread(Buf,1,BUF,stdin);
21     while(1)
22     {
23         if(buf-Buf+1>=tot)break;
24         read(n),read(k);
25         F(i,1,n)read(sum[i]),sum[i]+=sum[i-1];
26         int head=1,tail=0;
27         double ans=0;
28         F(i,k,n)
29         {
30             while(head<tail&&useless(Q[tail-1],Q[tail],i-k))tail--;
31             Q[++tail]=i-k;
32             while(head<tail&&useless(Q[head+1],Q[head],i))head++;
33             ans=max(ans,(sum[i]-sum[Q[head]])*1.0/(i-Q[head]));
34         }
35         printf("%.2f\n",ans);
36     }
37     return 0;
38 }
View Code

 

hdu 2993 MAX Average Problem(斜率DP入门题)

标签:include   double   int   show   stdin   space   输入   namespace   ref   

原文地址:http://www.cnblogs.com/bin-gege/p/6133491.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!