Acwing-102-最佳牛围栏(二分,实数)

链接:

https://www.acwing.com/problem/content/104/

题意:

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

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

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

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

思路:

二分最大值,然后前缀和检查一遍.

代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+10;
double a[MAXN], b[MAXN], Sum[MAXN];
double eps = 1e-5;
int n, f;

bool Check(double mid)
{
    double minval = 1e10;
    double ans = -1e10;
    for (int i = f;i <= n;i++)
    {
        minval = min(minval, Sum[i-f]);
        ans = max(ans, Sum[i]-minval);
    }
    if (ans > 0)
        return true;
    return false;
}

int main()
{
    scanf("%d %d", &n, &f);
    for (int i = 1;i <= n;i++)
        scanf("%lf", &a[i]);
    double l = -1e6, r = 1e6;
    double ans = 0;
    while (r-l > eps)
    {
        double mid = (l+r)/2;
        for (int i = 1;i <= n;i++)
            b[i] = a[i]-mid;
        for (int i = 1;i <= n;i++)
            Sum[i] = Sum[i-1]+b[i];
        if (Check(mid))
        {
            l = mid;
            ans = max(ans, mid);
        }
        else
            r = mid;
    }
    printf("%d\n", int(r*1000));

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/YDDDD/p/11469150.html