【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;
}
posted @ 2020-12-26 08:59  Jayun  阅读(149)  评论(0编辑  收藏  举报