您的位置:首页 > 其它

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

2016-12-05 12:35 316 查看

题目链接: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
,Q
,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

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: