解析

这道题寻找平均值的max,答案明显具有单调性,所以采用二分算法
从0到1不断取中点mid作为平均值的可能点,看是否存在不短于l的数列均值>=mid不难得到以下代码:

double st=0,ed=1;for(int i=1;i<=10;i++){double mid=(st+ed)/2;if(check(mid)) st=mid;else ed=mid;}

现在的问题就是要解决这个check函数的写法了
因为N范围到1e5,暴力的On方肯定是会超的
我们想到可以先把数组都减mid,这样就转化为是否存在不短于L的数列加和大于等于0的问题
我们用s[i]表示1到i的加和
那么a到b的和可以转化为s[b] - s[a-1](其中b-a+1 >=l)
要使s[b] - s[a-1]最大,就要使s[a-1]取的是s[0]到s[b-l+1]的最大值
而随着b从l循环到n,每次s[a-1]只加入了一个可能取的元素,故只需与该新值取min,不必遍历
代码如下:

double mn=M;for(int i=l;i<=n;i++){mn=min(mn,s[i-l]);if(s[i]-mn>=0) return true;//只要存在就返回true }return false;

这样check函数的时间复杂度就为O(n)

AC快乐~~~~~~

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int M = 2e9;
int n,l,t;
int zuo,you;
int f[100500];
bool check(double x){double s[100500]={ };s[1]=f[1] - x;for(int i=2;i<=n;i++){s[i] = s[i-1] + f[i] -x;//求减完x的前缀和 }double mn=M;for(int i=l;i<=n;i++){mn=min(mn,s[i-l]);if(s[i]-mn>=0) return true;//只要存在就返回true }return false;
}
int main(){scanf("%d",&t);for(int k=1;k<=t;k++){scanf("%d%d",&n,&l);for(int i=1;i<=n;i++){scanf("%1d",&f[i]);}double st=0,ed=1;for(int i=1;i<=10;i++){double mid=(st+ed)/2;if(check(mid)) st=mid;else ed=mid;}double x=st;double s[100500]={ };s[1]=f[1] - x;for(int i=2;i<=n;i++){s[i] = s[i-1] + f[i] -x;}int a,flag=0;double mn=M;for(int i=l;i<=n;i++){if(mn>s[i-l]){mn=s[i-l];a=i-l;}if(s[i]-mn>=0){if(flag==0){zuo=a+1;you=i;flag=1;}else if(you-zuo>i-a){zuo=a+1;you=i;}}}printf("%d %d\n",zuo,you);}return 0;
}

祝大家rp++!

二分算法:平均值(洛谷 UVA1451)相关推荐

  1. 二分答案——木材加工(洛谷 P2440)

    题目选自洛谷P2440 读完题目后应该有个大致思路,看得出来是二分查找的题. 首先我们输入 n 和 k 并且运用二分找到合适的尺寸,而l 必须要足够小,r 必须要足够的大.题中写道数组中的数最大不会超 ...

  2. 通过“FBI树”复习二叉树算法(洛谷P1087题题解,Java语言描述)

    题目要求 P1087题目链接 分析 所谓的"FBI树",其实就是一种二叉树,最后的结果也无非就是二叉树的后序遍历序列. 所以,考察的知识点就是--二叉树基本算法的灵活运用. 本题关 ...

  3. [二分][前缀和]洛谷 P1083 借教室

    题意: 有n天,m个请求.n天内每天的可用教室为a_ia​i​​个,m个请求是从l到r天租借t个教室. 如果某一天的教室分配无法满足,则输出当前的订单号. 思考: 一开始根本没想到这个东西怎么二分.. ...

  4. 贪心算法:洛谷P1803凌乱的yyy解析(java)

    题目描述 相关链接:https://www.luogu.com.cn/problem/P1803 解析 这道题对于java来说,第一思路应该是贪心算法,创建一个二维数组(或者创建两个数组),然后对结束 ...

  5. 【题解】【算法】- 洛谷 - P3799 妖梦拼木棒(组合数学)

    题目背景 上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来. 题目描述 有 n 根木棒,现在从中选 4 根,想要组成一个正三角形,问有几种选法? 答案对 109 + 7 取模. 输入格式 第一行一 ...

  6. 洛谷 P1028 数的计算

    递推计算即可 f[1]=1 f[2]=2=f[1]+1 f[3]=2=f[1]+1 f[4]=4=f[1]+f[2]+1 f[5]=4=f[1]+f[2]+1 我的代码(算法借鉴洛谷题解) #incl ...

  7. 洛谷p1216 IOI1994 Day1T1

    洛谷p1216 IOI1994 Day1T1 洛谷原题 题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以走到左下方的点也可以到达右下 ...

  8. 算法设计 - 二分法和三分法,洛谷P3382

    二分法 二分查找:找目标值位置 二分法是一种适用于特殊场景下的分治算法. 这里的特殊场景指的是,二分法需要作用在一个具有单调性的区间内. 比如,我们熟知的二分查找,就是一种二分法的具体实现,二分查找必 ...

  9. 二分答案——数列分段 Section II(洛谷 P1182)

    题目选自洛谷P1182 本题解法:二分答案+贪心 思路:首先,分析题目,求最大值的最小化,直接联想到二分,So我们直接二分答案,关键是要怎么去高效的check,我们考虑一个贪心的思路,能加的就加上,不 ...

最新文章

  1. 关于update set from where
  2. IDEA热布署报错java.lang.IllegalStateException: Restarter has not been initialized
  3. python 条形图图注怎么集中注意力_如何用每个条形图的总和(Matplotlib)注释堆积条形图?...
  4. js String方法集合
  5. time Interval in SAP UI5 SalesPipeline
  6. 1-26HashSet简介
  7. php foreach 循环 判断index 小于多少_Go 与 PHP 的语法对比
  8. Freeview%20Play是什么
  9. 火速拿来用!对比 12,000 个 Vue.js 开源项目发现最实用的 TOP45!
  10. iocomp iPlot使用说明15 Adding Data添加数据
  11. Tarjan算法详解
  12. 随机地图生成工具 fastMapper
  13. Android自动化测试框架Robotium
  14. 天线发射功率计算公式_天线增益的定义/计算公式/发射功率
  15. 软件项目管理大作业:项目内容介绍
  16. 最新B站优秀C4D教程汇总(超干)
  17. 概率问题的求解 —— 样本空间
  18. Oracle定时任务dbms_scheduler
  19. Spring Boot 和 Spring 有什么区别
  20. 河源实验室建设合理化细节探讨

热门文章

  1. 中科大量子计算机科学家,中国科学院量子信息重点实验室
  2. win2003无法进入桌面_救急,如何通过命令行备份桌面重要文件?
  3. 5码默认版块_5个小众的生活学习类的宝藏App
  4. 化妆definer是什么意思_化妆品上的r是什么意思
  5. 服务器运维监控指标,运维体系~指标监控~Prometheus监控告警与日志
  6. oracle取位置,获取oracle trace文件路径
  7. mysql使用索引下推的好处_mysql的索引下推理解和实践
  8. mysql数据库密码错误_MySQL数据库经典错误六 数据库密码忘记的问题
  9. 浅谈前端路由原理hash和history
  10. 全年营业额怎么计算_门店盈亏平衡计算及案例分析 | 商品管理