HDU2993_MAX Average Problem

题目要求你在n个数的序列中,找出一段连续的长度不小于k的连续的序列,使得这个序列的平均数最大。输出这个平均数。

典型的优先队列。首先我们需要根据输入的序列,制造一个和序列。

然后从k开始往后面走,其实每走一步都维护了一下优先队列,然后加入当前的这个数。

很简单吧应该。。。。。。

 

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #define maxn 100100
 5 using namespace std;
 6 
 7 int a[maxn],tep,n,k,tot,sum[maxn];
 8 int head,tail,j;
 9 int q[maxn];
10 double ans,tmp,dx1,dx2,dy1,dy2;
11 char c;
12 
13 int getnum()
14 {
15     tot=0;
16     c=getchar();
17     while (c<'0' || c>'9') c=getchar();
18     while (c>='0' && c<='9') tot=tot*10+c-'0',c=getchar();
19     return tot;
20 }
21 
22 int main()
23 {
24
25     while (scanf("%d%d",&n,&k)!=EOF)
26     {
27         tep=0;
28         for (int i=1; i<=n; i++) a[i]=getnum(),tep+=a[i],sum[i]=tep;
29         head=1,tail=0;
30         ans=0;
31         for (int i=k; i<=n; i++)
32         {
33             j=i-k;
34             while (tail-head>=1)
35             {
36                 dx1=q[tail]-q[tail-1];
37                 dy1=sum[q[tail]]-sum[q[tail-1]];
38                 dx2=j-q[tail];
39                 dy2=sum[j]-sum[q[tail]];
40                 if (dy2*dx1<=dy1*dx2) tail--;
41                     else break;
42             }
43             q[++tail]=j;
44             while (tail-head>=1)
45             {
46                 dx1=i-q[head];
47                 dy1=sum[i]-sum[q[head]];
48                 dx2=i-q[head+1];
49                 dy2=sum[i]-sum[q[head+1]];
50                 if (dy2*dx1>=dy1*dx2) head++;
51                     else break;
52             }
53             tmp=(sum[i]-sum[q[head]])*1.0/(i-q[head]);
54             ans=max(ans,tmp);
55         }
56         printf("%.2f\n",ans);
57     }
58     return 0;
59 }

 

转载于:https://www.cnblogs.com/lochan/p/3420851.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值