AcWing 102:最佳牛围栏 ← 二分+前缀和

这篇具有很好参考价值的文章主要介绍了AcWing 102:最佳牛围栏 ← 二分+前缀和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【题目来源】
https://www.acwing.com/problem/content/104/

【题目描述】
农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于 1 头,也不会超过 2000 头。
约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。
围起区域内至少需要包含 F 块地,其中 F 会在输入中给出。
在给定条件下,计算围起区域内每块地包含的牛的数量的平均值可能的最大值是多少。

【输入格式】
第一行输入整数 N 和 F,数据间用空格隔开。
接下来 N 行,每行输入一个整数,第 i+1 行输入的整数代表第 i 片区域内包含的牛的数目。

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

【数据范围】
1≤N≤100000
1≤F≤N

【输入样例】
10 6

4
2
10
3
8
5
9
4
1

【输出样例】
6500

【算法分析】
二分法、三分法,通常适用于求解具有
单调性的问题。
若二分法失效,甚至需要考虑引入三分法。
三分法实际就是二分法的扩展,即三分法将搜索范围分成三个部分 [le, lmid][lmid, rmid][rmid, ri],而不是两个。

AcWing 102:最佳牛围栏 ← 二分+前缀和,信息学竞赛,# 分治算法,二分法,三分法


三分法的代码模板如下所示:

while(ri-le>eps){
    double lmid=le+(ri-le)/3.0;
    double rmid=ri-(ri-le)/3.0;

    if(f(lmid)<f(rmid)) le=lmid;
    else ri=rmid;
}


【算法代码】

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

const int inf=0x3f3f3f3f;
const int maxn=1e5+5;
double a[maxn],s[maxn];
double imin,ans;
int n,f;

double check(double avg) {
    imin=inf;
    ans=-inf;
    for(int i=1; i<=n; i++) s[i]=s[i-1]+a[i]-avg;
    for(int i=f; i<=n; i++) {
        imin=min(imin,s[i-f]);
        ans=max(ans,s[i]-imin);
    }
    return ans;
}

int main() {
    cin>>n>>f;
    for(int i=1; i<=n; i++) cin>>a[i];
    double le=0,ri=1e6;
    while(ri-le>1e-5) {
        double mid=(le+ri)/2;
        if(check(mid)>0) le=mid;
        else ri=mid;
    }
    cout<<(int)(ri*1000)<<endl;
}


/*
in:
10 6
6
4
2
10
3
8
5
9
4
1

out:
6500
*/




【参考文献】
https://blog.csdn.net/weixin_43872728/article/details/105382365
https://www.cnblogs.com/guiyou/p/15110706.html













 文章来源地址https://www.toymoban.com/news/detail-809573.html

到了这里,关于AcWing 102:最佳牛围栏 ← 二分+前缀和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AcWing 730. 机器人跳跃问题(二分)

    机器人正在玩一个古老的基于 DOS 的游戏。 游戏中有 N+1 座建筑——从 0 到 N 编号,从左到右排列。 编号为 0 的建筑高度为 0 个单位,编号为 i 的建筑高度为 H(i) 个单位。 起初,机器人在编号为 0 的建筑处。 每一步,它跳到下一个(右边)建筑。 假设机器人在第

    2024年02月08日
    浏览(79)
  • AcWing 372. 棋盘覆盖(二分图&&匈牙利算法)

    输入样例: 输出样例: 解析:         n为100,状压肯定爆。         将每个骨牌看成二分图的一个匹配,即查找二分图的一个最大匹配,匈牙利算法。

    2024年02月14日
    浏览(38)
  • E. Scuza - 二分+前缀和

       分析:         暴力会超时,可以用二分,构建两个数组,一个是a[i],作为前缀和数组,一个是f[i]表示第i个台阶之前的最大高度的台阶,然后每次二分来查找k,因为尽可能地走的多,所以查找右边界,最后输出对应的前缀和。 代码:

    2024年02月13日
    浏览(40)
  • 【二分与前缀和】python例题详解

    文章目录 1、数的范围 2、数的三次方根 3、前缀和 4、子矩阵的和 5、机器人跳跃问题 1、数的范围 题目 给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。对于每个查询,返回一个元素 k的起始位置和终止位置(位置从 00 开始计数)。如果数组中不存在该元

    2024年04月28日
    浏览(43)
  • 有一些东西必不可少(前后背包+二分/前缀和优化)

    题意: 给定n个物品,每个物品具有权值a[i],在这些物品里选出若干个物品,使得权值和=k,就说是一个合法的方案。对于一个物品,如果存在一个合法的方案,在这个方案中去掉它以后方案就变成不合法了,就说这个物品是“必要的”。求有多少个物品是必要的。 n=5000,k=50

    2024年02月08日
    浏览(37)
  • C++ 算法竞赛、08 周赛篇 | AcWing 第94场周赛 ⭐

    4870. 装物品 - AcWing题库 4870. 装物品 - AcWing题库 巨简单题 4871. 最早时刻 - AcWing题库 考查堆优化版迪杰斯特拉变形 越早到达,越早离开 = 每个点维护一个最早到达时刻 如果 delay 小于 0,就不能用迪杰斯特拉算法 4872. 最短路之和 - AcWing题库 最终结果可能是 (500^2 * 10^5) 可能会

    2024年02月08日
    浏览(50)
  • C++ 算法竞赛、07 周赛篇 | AcWing 第120场周赛

    竞赛 - AcWing 5146. 最大GCD - AcWing题库 不难发现,最大公约数的条件是 (GCD(lfloor frac{n}{2} rfloor ,lfloor frac{n}{2} rfloor * 2)) 5147. 数量 - AcWing题库 不含 4 和 7 以外 (Rightarrow) 只含 4 和 7,每位只有两种情况,最多到 1e9,即 (2^9) 个情况,爆搜枚举即可 AcWing 5148. 字符串匹配 -

    2024年02月08日
    浏览(42)
  • C++ 算法竞赛、02 周赛篇 | AcWing 第2场周赛

    竞赛 - AcWing AcWing 3626. 三元一次方程 - AcWing 两层循环 3627. 最大差值 - AcWing题库 考查贪心,所有输入的不是0的数排序,每次操作取最大的数++,由于每个数最大可以是1e9,int可能溢出,需要用 long long 3628. 边的删减 - AcWing题库 刚开始有点傻,打算用克鲁斯卡尔生成最小生成树

    2024年02月10日
    浏览(38)
  • C++ 算法竞赛、03 周赛篇 | AcWing 第4场周赛

    竞赛 - AcWing 3694. A还是B - AcWing题库 简单题 3695. 扩充序列 - AcWing题库 考查递归。可以发现最终序列除中点,左右两段都是相等的,可以依据这个特性来递归 超级长的序列缩小 (log_2n) 次,每次将 k 坐标映射到缩小的各个序列上,k肯定是其中一个序列的中点 3696. 构造有向无环

    2024年02月09日
    浏览(39)
  • C++ 算法竞赛、01 周赛篇 | AcWing 第1场周赛

    竞赛 - AcWing 3577. 选择数字 - AcWing题库 暴力两层循环 两个数组的最大值相加一定是新数 3578. 最大中位数 - AcWing题库 整数二分问题。求中位数,并依次递增,计算所需的操作次数。求最后一个操作次数总和 = k 的中位数值 如果 mid - a[i] 0 ,意味着该数比中位数大, 不需要操作

    2024年02月10日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包