戳我进原题
题意:
给定一个长度为
n
n
n的序列
a
a
a,以及一个长度
l
e
n
len
len。问在这个序列
a
a
a中,可以找到的长度至少为
l
e
n
len
len的连续子序列的最大平均值为多少。
数据范围:
1
≤
n
≤
1
0
5
1\leq n\leq 10^5
1≤n≤105
题解:
二分答案。
每次二分的答案为
m
i
d
mid
mid,则考虑每次对每个元素减去
m
i
d
mid
mid后求前缀和,然后看是否可以找到一个长度至少为
l
e
n
len
len,且和大于等于
0
0
0的区间。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
const double eps = 1e-5;
int a[N], n, len;
double b[N];
bool check(double mid) {
for(int i = 1; i <= n; ++i) b[i] = b[i - 1] + (a[i] - mid);
double mn = 0;
for(int i = 0, j = len; j <= n; ++i, ++j) {
mn = min(mn, b[i]);
if(b[j] - mn >= 0) return true;
}
return false;
}
int main()
{
scanf("%d%d", &n, &len);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
double l = 1, r = 2000;
while(r - l > eps) {
double mid = (l + r) / 2;
if(check(mid)) l = mid;
else r = mid;
}
printf("%d\n", int(r * 1000));
return 0;
}