vlambda博客
学习文章列表

二分查找在NOIP中的运用


二分答案


学过我们趣味编程的同学都知道二分查找,它是一种效率较高的查找算法。那么,二分查找在信息学竞赛中到底有什么用呢?怎么样把它运用在我们具体的信息学题中呢?天老师就跟你们来探讨一下,信息学竞赛中的技巧--------二分答案。

二分查找在NOIP中的运用


有这么一个问题:光头强引进了一个强大的伐木工具,可以一根一根的锯倒木材。光头强设置一个高度参数H(米),伐木机升起一个巨大的锯片到高度H,并锯掉所有的树比H高的部分(当然,树木不高于H米的部分保持不变)。光头强得到树木被锯下的部分。

例如,如果一行树的高度分别为20151017光头强把锯片升到15米的高度,切割后树木剩下的高度将是15151015,而光头强将从第1棵树得到5米,从第4棵树得到2米,共得到7米木材。

光头强受到熊大熊二吉吉国王等的压力,所以他不会砍掉过多的木材。这正是他为什么尽可能高地设定伐木机锯片的原因。帮助光头强找到伐木机锯片的最大的整数高度H,使得他能得到木材至少为M米。换句话说,如果再升高1米,则他将得不到M米木材。

【输入格式】

1行:2个整数NMN表示树木的数量(1<=N<=1000000,M表示需要的木材总长度(1<=M<=2000000000

2行:N个整数表示每棵树的高度,值均不超过1000000000。所有木材长度之和大于M,因此必有解。

【输出格式】

1行:1个整数,表示砍树的最高高度。

二分查找在NOIP中的运用

题解

当看到这个题目时,很自然的就会想到:

1、答案是唯一的

2、答案是有一定范围的(1米 ~ 最高的那颗树)

根据正常思维可以暴力破解该题,从1米开始寻找到最高的米数直到找到答案为止,毫无疑问这是能够解出答案的。但同学们会发现树木的数量木材总长度数据范围过大,这样肯定会导致一个问题:用暴力枚举的方式必定无法通过题目所要求的运行时间(1s)。暴力破解能通过的测试点非常有限,所以能得20-30分,时间复杂度为O(n²)。

这时候我们就需要优化算法降低时间复杂度才能完美的通过。此问题的解,我们要从答案去思考,暴力解法是去遍历所有答案,本质上来说这就是搜索,逐个匹配从而寻找那个唯一的正解。

思考:这个答案除了具有之前我们所得到的特性外,还具有一个很重要的特性就是它是具有单调性的(从小到大)。我们就很自然的会想到优化这个搜索过程,可以采用二分查找去降低搜索的时间复杂度。每次取答案范围的中间值去比对,如果当前中间值所锯下的木头比M小,说明答案位于右区间,反之说明答案位于左区间,排除现有答案的一半。这个时候这个算法的时间复杂度降低为O(nlogn)。很明显这时候是一定可以满足该题运算时间1s的。

这是二分查找在信息学竞赛中的一类运用。

附带完整代码

二分查找在NOIP中的运用

coding