题目链接
http://poj.org/problem?id=2018
分析
对于求平均值的问题,往往是转化为每个数值减去平均值后,求最大区间和是否大于 0 0 0 即可。
本题同理,只是所选区间长度要不小于 F F F。
题目要求相当于保留三位小数,题目有误,数据中有 0 0 0,二分左端点 l l l 初始需要 < 1 < 1 <1。
AC代码
#include <cstdio>
#include <algorithm>
using namespace std;
inline int read() {
int num = 0;
char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9')
num = num * 10 + c - '0', c = getchar();
return num;
}
const int maxn = 1e5 + 5;
const double eps = 1e-6, inf = 1e20;
int n, f, a[maxn];
double b[maxn];
inline int judge(double x) {
double mins = inf;
for (int i = 1; i <= n; ++i) {
b[i] = b[i - 1] + a[i] - x;
if (i >= f) mins = min(mins, b[i - f]);
if (b[i] - mins >= 0) return 1;
}
return 0;
}
int main() {
n = read(), f = read();
for (int i = 1; i <= n; ++i) a[i] = read();
double l = 0, r = 2000;
while (l + eps < r) {
double mid = (l + r) / 2;
if (judge(mid)) l = mid;
else r = mid;
}
printf("%d", (int)(r * 1000));
return 0;
}