loj#10012\poj2018 Best Cow Fences(二分)

题目

#10012 「一本通 1.2 例 2」Best Cow Fences

解析

有序列\(\{a_i\}\),设\([l,r]\)上的平均值为\(\bar{x}\),有\(\sum_{i=l}^r(a_i-\bar{x})=0\)
这样我们就可以通过二分平均值,
先同减二分到的平均值,若存在一段区间的和大于等于0,说明这段区间的平均值大于等于二分值,上调边界,否则下调边界
只需要枚举右端点\(r\),判断\(sum[r]-sum[l-1]>=0(1\leq l\leq r - m + 1)\)即可

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-9;

int n, m;
double a[N], sum[N];

int main() {
    ios::sync_with_stdio(false);
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) cin >> a[i];
    double l = -1000000.0, r = 1000000.0;
    while (r - l > EPS) {
        double mid = (l + r) / 2;
        for (int i = 1; i <= n; ++i) sum[i] = a[i] - mid + sum[i - 1];
        double ans = -INF, mn = INF;
        for (int i = m; i <= n; ++i)
            mn = min(mn, sum[i - m]), ans = max(ans, sum[i] - mn);
        if (ans >= 0) l = mid;
        else r = mid;
    }
    cout << int(r * 1000);
}
全部评论

相关推荐

安静的鲸鱼offer...:神仙级别hr,可遇不可求,甚至他可能也是突然有感而发。只能说遇上是件幸事。
秋招开始捡漏了吗
点赞 评论 收藏
分享
10-29 15:51
嘉应学院 Java
后端转测开第一人:你把简历的学历改成北京交通大学 去海投1000份发现基本还是没面试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务