zoukankan      html  css  js  c++  java
  • Acwing:102. 最佳牛围栏(前缀和 + 二分)

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

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

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

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

    输入格式

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

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

    输出格式

    输出一个整数,表示围起区域内每块地包含的牛的数量的平均值可能的最大值乘以1000得到的数值。

    数据范围

    1N1000001≤N≤100000
    1FN1≤F≤N

    输入样例:

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

    输出样例:

    6500

    算法:前缀和 + 二分

    我也是看大佬的博客理解的:https://blog.csdn.net/belous_zxy/article/details/90271781

    这位大佬博客里面解释的很清楚...

    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    
    int arr[100005];
    double sum[100005];
    int n, F;
    
    bool fun(double aver) {
        for(int i = 1; i <= n; i++) {
            sum[i] = sum[i - 1] + arr[i] - aver;        //记录每个区间减去aver之后的结果
        }
        double minn = 1e9, ans = -1e9;
        for(int i = F; i <= n; i++) {
            minn = min(minn, sum[i - F]);       
            ans = max(ans, sum[i] - minn);
        }
        return ans >= 0;
    }
    
    int main() {
        scanf("%d %d", &n, &F);
        for(int i = 1; i <= n; i++) {
            scanf("%d", &arr[i]);
        }
        double l = -1e6, r = 1e6;
        while(r - l > 1e-5) {
            double mid = (l + r) / 2.0;
            if(fun(mid)) {
                l = mid;
            } else {
                r = mid;
            }
        }
        cout << (long long)(r * 1000) << endl;
        return 0;
    }
  • 相关阅读:
    C#:新邮件监听及搜索
    PHPexcel导入数据的时候出现object解决方法
    selectpage选择订单的时候,订单数量和金额会动态改变
    三、变量的简述
    TP框架where条件和whereOr条件同时使用
    一.OS运行机制
    二.进制简述
    1.go语言入门
    C# Redis学习系列二:Redis基本设置
    C# Redis学习系列一:Redis的认识、下载、安装、使用
  • 原文地址:https://www.cnblogs.com/buhuiflydepig/p/11284671.html
Copyright © 2011-2022 走看看