洛谷P1404
题目要求寻找一个序列的长度大于m的子串的平均数最大值
二分法求平均数
#include<cstdio>
#include<math.h>
#include<algorithm>
using namespace std;
const double ep = 1e-7;
const int maxn = 1e5 + 5;
int maxx;
double ans;
void scan(int a[maxn], int n)
{
int i;
for(i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
maxx = max(maxx, a[i]);
}
}
bool check(int a[maxn], int L, int n, double k)
{
int i, j;
double d[maxn] = {0}, minx = 0;
for(i = 1; i <= n; i++)
{
d[i] = d[i - 1] + a[i] - k;
if(i >= L)
{
minx = min(minx, d[i - L]);
if(d[i]- minx > 0) return true;
}
}
return false;
}
void binary(int a[maxn], int n, int L)
{
double l = 0.0, r = maxx, mid;
while(r - l > ep)
{
mid = (l + r) / 2;
if(check(a, L, n, mid)) l = mid;
else r = mid;
}
printf("%d", (int)(r * 1000));
}
int main()
{
int n, m;
int a[maxn]= {0};
scanf("%d %d", &n, &m);
scan(a, n);
binary(a, n, m);
return 0;
}