码迷,mamicode.com
首页 > 其他好文 > 详细

【YBTOJ】【USACO03MAR】最大均值

时间:2020-12-31 11:46:49      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:math   ble   正整数   class   mat   序列   check   usaco   sum   

题目大意:

给定正整数序列 \(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】最大均值

标签:math   ble   正整数   class   mat   序列   check   usaco   sum   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!