平均数
原题链接:平均数
题目大意
给你长度为(n)的数列,找出该数列的一个子串,使得子串平均数最大化,并且子串长度(>=m)
题目题解
不知道为什么给标签给数论...我没看到和数论有半毛钱关系...
很简单的题,二分平均数大小,用每个数去减这个,只要大于零的都是能够给我们增收益的,怎样处理这个长度变化的子串?很简单,用前缀和维护一下就好
代码如下(秒杀题)
//#define fre yes
#include <cstdio>
#include <iostream>
const int N = 100005;
int arr[N]; double sum[N];
int n, m;
bool check(double avg) {
for (int i = 1; i <= n; i++) {
sum[i] = sum[i - 1] + (arr[i] - avg);
}
double minv = 0;
for (int i = 0, j = m; j <= n; j++, i++) {
minv = std::min(minv, sum[i]);
if(sum[j] - minv >= 0) return true;
} return false;
}
int main() {
scanf("%d %d", &n, &m);
double l = 0, r = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &arr[i]);
r = std::max(r, (double)arr[i]);
}
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;
}