二分查找在NOIP中的运用
Posted 极客晨星少儿编程怀德校区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找在NOIP中的运用相关的知识,希望对你有一定的参考价值。
二分答案
学过我们趣味编程的同学都知道二分查找,它是一种效率较高的查找算法。那么,二分查找在信息学竞赛中到底有什么用呢?怎么样把它运用在我们具体的信息学题中呢?天老师就跟你们来探讨一下,信息学竞赛中的技巧--------二分答案。
有这么一个问题:光头强引进了一个强大的伐木工具,可以一根一根的锯倒木材。光头强设置一个高度参数H(米),伐木机升起一个巨大的锯片到高度H,并锯掉所有的树比H高的部分(当然,树木不高于H米的部分保持不变)。光头强就得到树木被锯下的部分。
例如,如果一行树的高度分别为20,15,10和17,光头强把锯片升到15米的高度,切割后树木剩下的高度将是15,15,10和15,而光头强将从第1棵树得到5米,从第4棵树得到2米,共得到7米木材。
光头强受到熊大熊二吉吉国王等的压力,所以他不会砍掉过多的木材。这正是他为什么尽可能高地设定伐木机锯片的原因。帮助光头强找到伐木机锯片的最大的整数高度H,使得他能得到木材至少为M米。换句话说,如果再升高1米,则他将得不到M米木材。
【输入格式】
第1行:2个整数N和M,N表示树木的数量(1<=N<=1000000),M表示需要的木材总长度(1<=M<=2000000000)
第2行:N个整数表示每棵树的高度,值均不超过1000000000。所有木材长度之和大于M,因此必有解。
【输出格式】
第1行:1个整数,表示砍树的最高高度。
题解
当看到这个题目时,很自然的就会想到:
1、答案是唯一的
2、答案是有一定范围的(1米 ~ 最高的那颗树)
根据正常思维可以暴力破解该题,从1米开始寻找到最高的米数直到找到答案为止,毫无疑问这是能够解出答案的。但同学们会发现树木的数量和木材总长度数据范围过大,这样肯定会导致一个问题:用暴力枚举的方式必定无法通过题目所要求的运行时间(1s)。暴力破解能通过的测试点非常有限,所以能得20-30分,时间复杂度为O(n²)。
这时候我们就需要优化算法降低时间复杂度才能完美的通过。此问题的解,我们要从答案去思考,暴力解法是去遍历所有答案,本质上来说这就是搜索,逐个匹配从而寻找那个唯一的正解。
思考:这个答案除了具有之前我们所得到的特性外,还具有一个很重要的特性就是它是具有单调性的(从小到大)。我们就很自然的会想到优化这个搜索过程,可以采用二分查找去降低搜索的时间复杂度。每次取答案范围的中间值去比对,如果当前中间值所锯下的木头比M小,说明答案位于右区间,反之说明答案位于左区间,排除现有答案的一半。这个时候这个算法的时间复杂度降低为O(nlogn)。很明显这时候是一定可以满足该题运算时间1s的。
这是二分查找在信息学竞赛中的一类运用。
附带完整代码
coding
以上是关于二分查找在NOIP中的运用的主要内容,如果未能解决你的问题,请参考以下文章
P2075 [NOIP2012T5]借教室 区间更新+二分查找
关于二分查找binary_search的结构体struct运用
二分查找(vijos1116一元三次方程求解NOIP2001第一题)