P1419 寻找段落
题面
给定一个长度为 \(n\) 的序列 \(a\),定义 \(a_i\) 为第 \(i\) 个元素的价值。现在需要找出序列中最有价值的“段落”。段落的定义是长度在 \([S, T]\) 之间的连续序列。最有价值段落是指平均值最大的段落。
段落的平均值 等于 段落总价值 除以 段落长度。
输入格式
第一行一个整数 \(n\),表示序列长度。
第二行两个整数 \(S\) 和 \(T\),表示段落长度的范围,在 \([S, T]\) 之间。
第三行到第 \(n+2\) 行,每行一个整数表示每个元素的价值指数。
输出格式
一个实数,保留 \(3\) 位小数,表示最优段落的平均值。
数据范围
对于 \(30\%\) 的数据有 \(n \le 1000\)。
对于 \(100\%\) 的数据有 \(1 \le n \le 100000\),\(1 \le S \le T \le n\),\(-{10}^4 \le a_i \le {10}^4\)。
题目来源
tinylic 改编
思路
暴力好题。
代码
#include <bits/stdc++.h>
using namespace std;
int n,s,t,a[100005],qzh[100005];
double ans=-0x7f7f7f7f;
int main(){
cin>>n>>s>>t;
for(int i=1;i<=n;i++){
cin>>a[i];
qzh[i]=qzh[i-1]+a[i];
}
for(int i=s;i<=t&&((double)clock() / CLOCKS_PER_SEC <= 0.95);i++){
for(int j=i;j<=n;j++){
ans=max(ans,(qzh[j]-qzh[j-i])/(double(i)));
}
}
printf("%.3f",ans);
return 0;
}