【YBTOJ】【USACO03MAR】最大均值
题目大意:
给定正整数序列 \(A\),求一个平均数最大的,长度不小于 \(L\) 的(连续的)子段。
正文:
二分平均值,如果原序列减去所二分的值,那么就能找到其中的单调性:若平均值过大,最大的长度不小于 \(L\) 的子段和是负数;过小则会很大。
那么根据这个为 key 二分,就能得到答案。但注意精度问题。
代码:
int n, m;
int a[N];
double l, r;
double b[N], sum[N];
bool check(double x)
{
for (int i = 1; i <= n; i++)
b[i] = a[i] - x;
for (int i = 1; i <= n; i++)
sum[i] = sum[i - 1] + b[i];
double mn = 1e9, ans = -1e9;
for (int i = m; i <= n; i++)
{
mn = min(mn, sum[i - m]);
ans = max(ans, sum[i] - mn);
}
return ans >= 0;
}
int main()
{
scanf ("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf ("%d", &a[i]);
l = -1e-6, r = 1e6;
while (r - l > 1e-5)
{
double mid = (l + r) / 2;
if (check(mid)) l = mid;
else r = mid;
}
printf ("%d\n", int (r * 1000));
return 0;
}