文章目录

  • 题目
  • 题解

题目

农夫约翰的农场由 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

题解

来源:最佳牛围栏

题目分析

选取长度最短为f的子序列,其平均值最大。这里的难度在于长度可以大于f,而不是固定f。

我们的思路是,平均值最大问题(最优化问题)转化为一个判定问题:猜想(二分)出来一个平均值mid,判断是否存在一个长度大于等于f的连续子序列满足。

有关平均值的常用技巧:一个序列的平均值大于mid ⟺\Longleftrightarrow⟺把序列中每个元素都减去mid,然后求和,只要和大于0

使用双指针:i 和 j,其间隔为f。需要记录i指针前面部分的最小值,每次判断sum[j]大于等于i前面区间的最小值:sum[j] ≥ min[sum(0 ~ i)],如果满足,则二分往后半区间移动。

注意,这里就满足了区间长度大于等于m:因为i 和 j已经间隔m,然后如果取i前面的值,则区间长度大于m。

在代码中:minv是最小的前缀和,sum[j]也是前缀和,只要sum[j]减去minv大于零,表示从前缀和是minv的位置到j这个区间中的所有值的和大于0,也就是平均值大于mid。

时间复杂度: O(nlogr)O(nlogr)O(nlogr),其中r为二分的长度,这里是≤ 2000,n为序列的长度。

ac代码

#include <bits/stdc++.h>using namespace std;
const int N = 1e5 + 10;
int cows[N];
int n, m;
double sum[N];bool check(double avg) {// 每个数变成它减去平均数,再求前缀和for (int i = 1; i <= n; i ++) sum[i] = sum[i - 1] + cows[i] - avg;double minv = 0;// 双指针for (int i = 0, j = m; j <= n; j ++, i ++) {minv = min(minv, sum[i]); // [0, i]的最小值if (sum[j] >= minv) return true; // sum[j] >= minv:存在长度≥m,且平均值≥ avg}return false;
}int main() {cin >> n >> m;for (int i = 1; i <= n; i ++) cin >> cows[i];double l = 0, r = 2000; // 可取的平均值一定在[0, 2000]之间// 二分平均值while (r - l > 1e-5) {double mid = (l + r) / 2;if (check(mid)) l = mid; // 如果mid满足啦,就判断更大的平均值,即l = midelse r = mid;}cout << int(r * 1000) << endl;}

《算法竞赛进阶指南》打卡-基本算法-AcWing 102. 最佳牛围栏:浮点数二分、前缀和、双指针相关推荐

  1. 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩

    文章目录 题目解答 题目链接 题目解答 分析: 此题和笔者另一篇博文很像,只不过是限定了个数.<算法竞赛进阶指南>打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归.二进 ...

  2. 金字塔(算法竞赛进阶指南)

    虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下. 经过多年的研究,科学家对这座金字塔的内部结构已经有所了解. 首先,金字塔由若干房间组成,房间之间连有通道. 如果把房间看作节点, ...

  3. 《算法竞赛进阶指南》数论篇

    <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSGS <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSG ...

  4. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合

    又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...

  5. CH5202 自然数拆分Lunatic版(算法竞赛进阶指南,完全背包)

    算法竞赛进阶指南,278页,完全背包 本题要点: 1.把完全背包的代码改改即可.常规的完全背包: 有n个物品,每个物品的体积是v[i], 价值是w[i], 求装到大小为m的大背包,能获得的最大价值(每 ...

  6. 中位数--《算法竞赛进阶指南》(货仓选址和七夕祭问题详解)

    中位数 今天又和大家见面了啦~ 依旧是 <算法竞赛进阶指南>的学习哦~ 中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本.种群或概 ...

  7. AcWing 122. 糖果传递【贪心】【《算法竞赛进阶指南》,微软面试题 , HAOI2008】

    AcWing 122. 糖果传递 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 122. 糖果传递 进阶题目 AcWing 105 ...

  8. 算法竞赛进阶指南 骑士放置

    4: 最大独立集 :选出最多的点,使得选出的点之间没有边. 求最大独立集:选出最小的点可以破坏所有的边 <==>最小点覆盖 <==>最大匹配数. 假设最大匹配数为m,共有n个点 ...

  9. 算法竞赛进阶指南 萌新入门!

    算法竞赛进阶指南 文章目录 算法竞赛进阶指南 前言 一.介绍本书 二.如何阅读本书 三.总结 **笔记思路和结构 ** 算法竞赛进阶指南 这篇文章就简单的写一下吧! 前言 ​ 作为一个想要入坑的算法的 ...

最新文章

  1. 利用libevent 和线程池实现高并发服务器的设计
  2. 中国交通节能减排行业运营效益状况及十四五建设格局分析报告2021-2027年
  3. 【经典回放】多种语言系列数据结构线性表之二:链表
  4. Java线程的优先级
  5. Windows Phone 8初学者开发—第7部分:本地化应用程序
  6. C++学习之路 | PTA乙级—— 1078 字符串压缩与解压 (20 分)(精简)
  7. tensorflow 各个版本的 CUDA 以及 Cudnn 版本对应关系
  8. C语言排序方法-----直接插入排序
  9. 拿着6位数工资,没写一行代码!为何还能成为最佳员工?
  10. linux epoll原理详解,Linux下selectpollepoll的实现原理(一)【转】
  11. 第一次在csdn写博客!
  12. 1.1 软件的定义、特征和分类
  13. 企业IT机房中使用什么灭火器?
  14. metaWRAP bin_refine 模块如何优化分箱结果
  15. linux 源码编译 ./configure 的配置和用法
  16. 简单的JsonParser(Java)
  17. abc计算机发明英语翻译,英语四级翻译模拟练习:四大发明
  18. UVALive - 3055 Symmetric Order【水题】【STL】
  19. 稳赢2020,华米科技何以再创新高?
  20. 打造爆款的方法介绍,打造爆款前怎样做店铺基础销量

热门文章

  1. MVC5 模型 生成EF
  2. ASP.NET MVC下的异步Action的定义和执行原理
  3. 用DzzOffice管理阿里云OSS
  4. 使用XSLT制作HTML邮件模板并发送
  5. 收敛标准对卷积核数量最优值的影响
  6. 如何验证c++代码线程安全性_Python3基础:如何验证你的代码
  7. Overfull \hbox或Underfull \hbox错误提示 基于LaTex+VSCode+MAC
  8. 【PC工具】chrome插件: Github 项目代码树形格式展示工具octotree
  9. 《雷达技术丛书》分享
  10. STM32硬件错误(HardFault_Handler)位置判断