Best Cow Fences
内存限制: 512 MiB 时间限制: 1000 ms 标准输入输出 题目类型: 传统 评测方式: 文本比较
题目描述
原题来自:USACO 2003 Mar. Green
给定一个长度为 n 的非负整数序列 A,求一个平均数最大的,长度不小于 L 的子段。
输入格式
第一行用空格分隔的两个整数 n 和 L;
第二行为 n 个用空格隔开的非负整数,表示 Ai 。
输出格式
输出一个整数,表示答案的 1000 倍。不用四舍五入,直接输出。
样例
样例输入
复制10 6
6 4 2 10 3 8 5 9 4 1
样例输出
复制6500
数据范围与提示
1 <= n <= 10 ^ 5, 0 <= Ai <= 2000。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int n, k;
int a[maxn];
double sum[maxn];
bool check(double x) {
for(int i = 1; i <= n; i++) {
sum[i] = sum[i - 1] + a[i] - x;
}
double q = INT_MAX;
for(int r = k; r <= n; r++) {
q = min(q, sum[r - k]);
if(sum[r] - q >= 0) {
return true;
}
}
return false;
}
int main() {
scanf("%d %d", &n, &k);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
double l = 0, r = 2e8;
while(l < r) {
double mid = (l + r) / 2 + 1;
if(check(mid / 1000)) {
l = mid;
} else {
r = mid - 1;
}
}
printf("%d", int(l + 0.5));//主要是精度问题,也可以手动加一
return 0;
}