ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【题解】AcWing 102.Best Cow Fences

2021-11-27 23:59:28  阅读:243  来源: 互联网

标签:mins Cow int 题解 sum mid double 102 avg


AcWing 102.最佳牛围栏

题目描述

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

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

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

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

输入格式

第一行输入整数 N N N 和 F F F,数据间用空格隔开。

接下来 N N N 行,每行输入一个整数,第 i + 1 i+1 i+1 行输入的整数代表第 i i i 片区域内包含的牛的数目。

输出格式

输出一个整数,表示平均值的最大值乘以 1000 1000 1000 再 向下取整 之后得到的结果。

数据范围

1 ≤ N ≤ 100000 1≤N≤100000 1≤N≤100000,
1 ≤ F ≤ N 1≤F≤N 1≤F≤N

输入样例

10 6
6 
4
2
10
3
8
5
9
4
1

输出样例

6500

题目分析

二分答案,判定“是否存在一个长度不小于 L L L 的子段,平均数不小于二分的值 a v g avg avg”。

如果把子段中每个数都减去 a v g avg avg,就变成了判定这个子段和是否非负。

我们可以先求出序列的前缀和,对于长度不小于 L L L 的子段和,只需 s u m [ i ] − m i n { s u m [ j ] ∣ 0 ≤ j ≤ i − L } sum[i]-min\{sum[j]|0\le j\le i-L\} sum[i]−min{sum[j]∣0≤j≤i−L} 即可。我们只需判断这个值是否非负,即 s u m [ i ] ≥ m i n s sum[i]\ge mins sum[i]≥mins 是否成立,若存在某个 i i i 使得上式成立,则 a v g avg avg 可取到,将其作为左端点继续二分;否则 a v g avg avg 过大,将其作为右端点继续二分。

代码:

#include <iostream>
using namespace std;

const int N = 100050;
int a[N], n, f;
double sum[N];

bool check(double avg){
    for (int i = 1; i <= n; i ++)
        sum[i] = sum[i - 1] + a[i] - avg;

    double mins = 0;
    for (int i = f, j = 0; i <= n; i ++, j ++){
        mins = min(mins, sum[j]);
        if (sum[i] >= mins) return 1;
    }
    return 0;
}

int main(){
    cin >> n >> f;
    for (int i = 1; i <= n; i ++)
        cin >> a[i];

    double l = 1, r = 2000;
    while (r - l > 1e-5){
        double mid = (l + r) / 2;
        if (check(mid)) l = mid;
        else r = mid;
    }
    cout << int(r * 1000);
    return 0;
}

标签:mins,Cow,int,题解,sum,mid,double,102,avg
来源: https://blog.csdn.net/f4u4u4r/article/details/121585537

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有