【算法】最佳牛围栏(二分,前缀和,双指针)

题目 

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

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

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

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

输入格式

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

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

输出格式

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

数据范围

1 ≤ N ≤ 100000
1 ≤ F ≤ N

输入样例:

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

输出样例:

6500

思路

       将每个农场的牛的数量存储到数组a[ ]中,二分平均值(答案),check()函数用来判断二分出来的平均值是否符合要求。

        其中s[ ]数组是s[i] = s[i - 1] + a[i] - avg;   得出来的 s[i]表示a[1]~a[ i ]中农场中牛的个数的平均值,由此可知,s[j] - s[i] 代表(i,j]的牛的数量的平均值。如下图所示:

check()数组代码: 

 

代码 

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n,f;
double a[N],s[N];bool check(double avg)
{for(int i = 1; i <= n; i ++) s[i] = s[i - 1] + a[i] - avg;// 求出来前缀和double mins = 0;for(int k = f; k <= n; k ++){mins = min(mins,s[k - f]);// 求出区间为f的农场牛的平均值的最小值if(s[k] - mins >= 0) return true;// 判断}return false;
}int main()
{cin >> n >> f;double l = 0,r = 0;for(int i = 1; i <= n; i ++){cin >> a[i];r = max(r,a[i]);}while(r - l > 1e-5){double mid = (l + r) / 2;if(check(mid)) l = mid;else r = mid;}printf("%d",(int)(r * 1000));return 0;
}

题目来自: 102. 最佳牛围栏 - AcWing题库

难度:简单
时/空限制:1s / 64MB
总通过数:16264
总尝试数:39506
来源:《算法竞赛进阶指南》, POJ2018, kuangbin专题
算法标签:二分  icon-default.png?t=N7T8https://www.acwing.com/problem/search/1/?search_content=%E4%BA%8C%E5%88%86前缀和icon-default.png?t=N7T8https://www.acwing.com/problem/search/1/?search_content=%E5%89%8D%E7%BC%80%E5%92%8C   双指针icon-default.png?t=N7T8https://www.acwing.com/problem/search/1/?search_content=%E5%8F%8C%E6%8C%87%E9%92%88

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/341747.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android开发】不同Activity之间的数据回传实例(二)星座测算游戏

一、功能介绍 该项目实现的功能主要有&#xff1a; 在程序的首页界面可以输入用户的姓名&#xff0c;并且可以通过下方的日历栏选择自己的出生日期。输入完成后&#xff0c;点击星座测算按钮&#xff0c;则程序跳转到星座分析界面。在该界面上显示用户的个人信息&#xff0c;…

HarmonyOS 开发基础(八)Row和Column

HarmonyOS 开发基础&#xff08;八&#xff09;Row和Column 一、Column 容器 1、容器说明&#xff1a; 纵向容器主轴方向&#xff1a;从上到下纵向交叉轴方向&#xff1a;从左到右横向 2、容器属性&#xff1a; justifyContent&#xff1a;设置子元素在主轴方向的对齐格式…

货拉拉智能监控实践:如何解决多云架构下的故障应急问题?

一分钟精华速览 在月活超千万的大规模业务背景下&#xff0c;货拉拉遭遇了多云环境下的监控碎片化、规划无序等问题。为了应对这些挑战&#xff0c;货拉拉开发了一站式监控平台——Monitor。该平台的部署有效地实现了对核心应用的监控和报警全覆盖&#xff0c;显著提高了应急响…

写点东西《Docker入门(上)》

写点东西《Docker入门&#xff08;上&#xff09;》 环境变量 Docker 镜像 Docker CMD 与 ENTRYPOINT 有什么区别 Docker 中的网络&#xff1a; Docker 存储&#xff1a; Docker 是一个工具&#xff0c;允许开发人员将他们的应用程序及其所有依赖项打包到一个容器中。然后&…

Java Http各个请求类型详细介绍

1. 前言 在Spring Boot框架中&#xff0c;HTTP请求类型是构建Web应用程序的重要组成部分。常见的请求类型包括GET、POST、PUT和DELETE&#xff0c;每种类型都有其特定的用途和特点。本文将详细比较这四种请求类型&#xff0c;帮助您在开发过程中做出明智的选择。 2. GET请求…

你知道谁才是 “最懂程序员” 的搜索引擎?

大家好&#xff0c;我是奇兵&#xff0c;作为一名程序员&#xff0c;我们开发的过程中几乎每天都和搜索引擎打交道&#xff0c;利用它来搜文档、解决 Bug 等等。 而随着 AI 的发展&#xff0c;搜索引擎也变得越来越智能&#xff0c;市面上也涌现除了越来越多的 AI 搜索引擎。 …

少儿编程 2023年12月中国电子学会图形化编程等级考试Scratch编程三级真题解析(选择题)

2023年12月scratch编程等级考试三级真题 选择题 1、运行左图程序,想得到右图中的效果,红色框应填写的数值是 A、12 B、11 C、10 D、9 答案:D 考点分析:考查积木综合使用,从右边的图形中可以看到第一层小正方形个数为9个,而左边程序中内外层循环的次数都是一样,所以…

机器学习-协同过滤

1、协同过滤要解决的问题 协同过滤算法主要用于推荐系统&#xff0c;推荐系统是信息过载所采用的措施&#xff0c;面对海量的数据信息&#xff0c;从中快速推荐出符合用户特点的物品。一些人的“选择恐惧症”、没有明确需求的人。 解决如何从大量信息中找到自己感兴趣的信息。…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷③

单元测试 一、任务要求 题目1&#xff1a;输入一个大写字母一个小写字母。根据输入的第一个字母和英文周几单词的第一个大写字母判断是周几&#xff0c;如果无法根据第一个大写字母判断&#xff0c;则继续根据输入的第二个小写字母进行判断&#xff0c;最终返回正确的英文周几…

排序之希尔排序

希尔排序&#xff0c;也被称为缩小增量排序&#xff0c;是一种基于插入排序的算法。它通过比较相距一定间隔的元素&#xff0c;来工作&#xff0c;然后再逐渐减小间隔&#xff0c;直到整个数组排序完成。这种算法的主要优点是对于部分有序的数组&#xff0c;其效率非常高&#…

编码器与解码器LLM全解析:掌握NLP核心技术的关键!

让我们深入了解&#xff1a;基于编码器和基于解码器的模型有什么区别&#xff1f; 编码器与解码器风格的Transformer 从根本上说&#xff0c;编码器和解码器风格的架构都使用相同的自注意力层来编码词汇标记。然而&#xff0c;主要区别在于编码器旨在学习可以用于各种预测建模…

Java--ListUtil工具类,实现将一个大列表,拆分成指定长度的子列表

文章目录 前言实现代码执行结果 前言 在项目中有时会出现列表很大&#xff0c;无法一次性批量操作&#xff0c;我们需要将列表分成指定大小的几个子列表&#xff0c;一份一份进行操作&#xff0c;本文提供这样的工具类实现这个需求。 实现代码 public class ListUtils {publ…