首页 > 其他 > 详细

【YBTOJ】【USACO03MAR】最大均值

时间:2020-12-26 10:20:12      阅读:69      评论:0      收藏:0      [点我收藏+]

题目大意:

给定正整数序列 \(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;
}

【YBTOJ】【USACO03MAR】最大均值

原文:https://www.cnblogs.com/GJY-JURUO/p/14191424.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!