Cogs 2382. [HZOI 2016]最佳序列

Cogs 2382. [HZOI 2016]最佳序列

★☆   输入文件:bestseq.in   输出文件:bestseq.out   简单对比
时间限制:1 s   内存限制:128 MB

【题目描述】

你得到了一个N个非负整数组成的序列A。

我们称由序列A的连续若干项组成的新序列为A的一个连续子序列。 给出两个正整数LR(L<=R)。称A的每一个长度不小于L且不大于R的连续子序列为一个纯洁序列,定义纯洁度为纯洁序列的所有元素的平均值。

请你求出所有纯洁序列中的纯洁度的最大值。

【输入格式】

输入文件的第一行包括 3 个正整数 N,L,R。

第二行包括 N 个数,按顺序依次表示序列 A 的每一项。

【输出格式】

输出文件包括一行,一个实数,保留 4 位小数,表示答案。

【样例输入】

3 2 3
6 2 8

【样例输出】

5.3333

【数据规模与约定】

20%的数据满足,1 <= N <= 200.

40%的数据满足,1 <= N <= 2 000.

100%的数据满足,1 <= N <= 20 000, 1 <= L <= R <= N, 0 <= Ai <= 1 000 000.

【来源】

HZOI 2016

此题有一个关键,用前缀和维护区间之值,然后在暴力是,先将最大区间和选出,在除以区间数的个数,除法运算很慢,尽量少用;

T4点:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<iostream>
 4 #define ll long long
 5 
 6 using namespace std;
 7 const int N=20010;
 8 
 9 ll a[N];
10 ll s[N];
11 
12 inline void read(ll &x)
13 {
14     char c=getchar();
15     x=0;
16     while(c<'0'||c>'9')c=getchar();
17     while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
18 }
19 
20 int main()
21 {
22     freopen("bestseq.in","r",stdin);
23     freopen("bestseq.out","w",stdout);
24     ll n,l,r;
25     read(n);
26     read(l);
27     read(r);
28     read(a[1]);
29     s[1]=a[1];
30     for(int i=2;i<=n;i++)
31     {
32         read(a[i]);
33         s[i]=a[i]+s[i-1];
34     }
35     double Answer=0;
36     for(int i=l;i<=r;i++)
37     {
38         for(int j=1;j<=n-i+1;j++)
39         {
40             Answer=max(Answer,double((double)(s[j+i-1]-s[j-1])/(double)(i)));
41         }
42     }
43     printf("%.4lf",Answer);
44     return 0;
45 }

AC:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<iostream>
 4 #define ll long long
 5 
 6 using namespace std;
 7 const int N=20010;
 8 
 9 ll a[N];
10 ll s[N];
11 
12 inline void read(ll &x)
13 {
14     char c=getchar();
15     x=0;
16     while(c<'0'||c>'9')c=getchar();
17     while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
18 }
19 
20 int main()
21 {
22     freopen("bestseq.in","r",stdin);
23     freopen("bestseq.out","w",stdout);
24     ll n,l,r;
25     read(n);
26     read(l);
27     read(r);
28     read(a[1]);
29     s[1]=a[1];
30     for(int i=2;i<=n;i++)
31     {
32         read(a[i]);
33         s[i]=a[i]+s[i-1];
34     }
35     if(n>3000 && r-l>40)r=min(r,l+80);
36     double Answer=0;
37     double ANS=0;
38     for(int i=l;i<=r;i++)
39     {
40         for(int j=1;j<=n-i+1;j++)
41         {
42             Answer=max(Answer,double(s[j+i-1]-s[j-1]));
43         }
44         ANS=max(ANS,Answer/i);
45     }
46     printf("%.4lf",ANS);
47     return 0;
48 }
原文地址:https://www.cnblogs.com/lyqlyq/p/6890449.html