二分法是程序设计中非常常用的一种算法,比赛中经常会使用到,在我参加的这些比赛里,几乎每一场比赛都会有多多少少涉及到二分法的题目。二分法不仅仅是用来比较一个数在一个数列里所处的大小位置,有时候还有很多更巧妙的用法。
需要注意的是,要使用二分法解决的问题,答案一定是随着已知参数单调递增或者递减的,就是说你要寻找的那个解,他的解空间一定是有序的。
比赛中的题目一般都是直接二分搜索答案,将搜索的那个值放到一个函数中进行判定,根据是否满足条件,调整要搜索的解空间,判定函数中可能会用到贪心思想。
例题1:大白书《挑战程序设计竞赛》P140
假定一个解并判断是否可行
http://blog.csdn.net/qdbszsj/article/details/49556457
例题2:大白书《挑战程序设计竞赛》P142
最大化最小值,假定解后进行贪心,看是否可行
http://blog.csdn.net/qdbszsj/article/details/49556489
例题3:HDU 4430 数学+二分,这种题不常见,主要练习upper_bound,lower_bound
直接在一堆数里搜答案,可以用upper_bound,lower_bound
hdu4430 Yukari'sBirthday 2012 ACM_ICPC Asia ChangChun Regional Contest problem K
http://blog.csdn.net/qdbszsj/article/details/48688649
intb=*lower_bound(a,a+9,21);
b=lower_bound指针指向的位置的值。
lower指向第一个大于等于要求的那个点,upper指向第一个大于要求的那个点
upper_bound(a,a+9,5)-lower_bound(a,a+9,5)可用来求有序数组中某值的个数
在set,map里:
a=s.upper_bound(3)//a是一个指针,s是一个set或者map
习题1:
http://blog.csdn.net/qdbszsj/article/details/54234133
习题2:
JNUOJ 1151 方杯子,这个题目是我出的,是个公式题,修改一下数据提高一下需要的精度,就需要使用二分了,这个题可以不用做,看一下了解思路就行。
http://jnuacm.club:8080/jnuoj/problem_show.php?pid=1151
习题集:
见大白书P283
poj 3273
poj 3104
poj 3045
poj 2976
poj 3111
poj 3579
poj 3685
poj 2010
poj 3662
poj 1759
poj 3484