AcWing 102. 最佳牛围栏 解题报告
给你一个长度为
n 的数列,求出这个数列的平均数最大且长度不小于L 的连续子段。
思路
首先思考一下怎么快速的求一个子序列平均数最大的问题:
在一个数列
我们可以观察到一个性质:设
则
所以我们可以利用
若
代码
#include <cstring>
#include <iostream>
#include <cstdio>
#include <cctype>
#include <cmath>
#define ll long long
#define ri register int
const double eps = 1e-5;
const int N = 100010;
const int M = 100010;
template <typename T> inline T min(T x,T y) {return x<y?x:y;}
template <typename T> inline T max(T x,T y) {return x>y?x:y;}
int n,m;
double a[N],sum[N],b[N];
bool check(double mid) {
for (int i = 1;i <= n;++i) {
b[i] = a[i] - mid;
}
for (int i = 1;i <= n;++i) {
sum[i] = sum[i-1] + b[i];
}
double minn = 1e10,maxx = -1e10;
for (int i = m;i <= n;++i) {
minn = min(minn,sum[i-m]);
maxx = max(maxx,sum[i]-minn);
}
if (maxx >= 0) return true;
else return false;
}
int main() {
std::cin >> n >> m;
for (int i = 1;i <= n;++i) scanf("%lf",&a[i]);
double l = -1e6,r = 1e6;
while (r-l > eps) {
double mid = (l + r) / 2;
if (check(mid)) l = mid;
else r = mid;
}
std::cout << int(r*1000);
return 0;
}
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭