题意
给你一个正整数序列,找出一个区间使得平均值最大,要求该区间的长度大于等于f,输出ans*1000的直接取整。
输入
10 6 //n f
6
4
2
10
3
8
5
9
4
1
输出
6500
#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
using namespace std;
int n,f,a[111111],sum[111111];
double ts[111111];
bool c(double x) {
for (int i = n; i > 0; i--)
ts[i] = max(0.0,max(a[i] - x, ts[i + 1] + a[i] - x));
for (int i = 1; i <= n - f + 1; i++)
if (sum[i + f - 1] - sum[i - 1] + ts[i + f] >= f * x)
return true;
return false;
}
int main(){
double lb = 0, ub = INF,mid;
scanf("%d%d", &n, &f);
for (int i = 1; i <= n; i++) {
scanf("%d", a + i);
sum[i] = sum[i - 1] + a[i];
lb = min(lb, (double)a[i]);
ub = max(ub, (double)a[i]);
}
while (ub-lb > 0.0001) {
mid = (lb + ub) / 2;
if (c(mid))lb = mid;
else ub = mid;
}
printf("%d\n", int(ub * 1000));
return 0;
}