最佳牛围栏 题解

题目描述

农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过2000头。

约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。

围起区域内至少需要包含 F 块地,其中 F 会在输入中给出。

在给定条件下,计算围起区域内每块地包含的牛的数量的平均值可能的最大值是多少。

输入格式

第一行输入整数 N 和 F ,数据间用空格隔开。

接下来 N 行,每行输出一个整数,第i+1行输出的整数代表,第i片区域内包含的牛的数目。

输出格式

输出一个整数,表示围起区域内每块地包含的牛的数量的平均值可能的最大值乘以1000得到的数值。

样例输入

10 6
6 
4
2
10
3
8
5
9
4
1

样例输出

6500

分析

二分板题。。。
+前缀和

AC代码

#include <cstdio>

int n, f;
const int MAXN = 100005; 
int a[MAXN]; 
double s[MAXN];

bool check(double k) {
	for(int i = 1; i <= n; i++)
		s[i] = a[i] - k + s[i - 1];
	double mi = 0;
	for(int i = f, j = 0; i <= n; i++, j++) {
		if(mi > s[j]) mi = s[j];
		if(s[i] >= mi) return 1;
	}
	return 0;
}
int main() {
	scanf ("%d %d", &n, &f);
	for(int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	double l = 0, r = 2000;
	while(r - l > 1e-5) {
		double mid = (l + r) / 2;
		if(check(mid)) l = mid;
		else r = mid;
	}
	printf("%d", (int)(r * 1000));
	return 0;
}
原文地址:https://www.cnblogs.com/Chain-Forward-Star/p/13868083.html