1. 程式人生 > >2017年1月ACM留校培訓——二分專題

2017年1月ACM留校培訓——二分專題

二分法是程式設計中非常常用的一種演算法,比賽中經常會使用到,在我參加的這些比賽裡,幾乎每一場比賽都會有多多少少涉及到二分法的題目。二分法不僅僅是用來比較一個數在一個數列裡所處的大小位置,有時候還有很多更巧妙的用法。

需要注意的是,要使用二分法解決的問題,答案一定是隨著已知引數單調遞增或者遞減的,就是說你要尋找的那個解,他的解空間一定是有序的。

比賽中的題目一般都是直接二分搜尋答案,將搜尋的那個值放到一個函式中進行判定,根據是否滿足條件,調整要搜尋的解空間,判定函式中可能會用到貪心思想。

例題1:大白書《挑戰程式設計競賽》P140

假定一個解並判斷是否可行

例題2:大白書《挑戰程式設計競賽》P142

最大化最小值,假定解後進行貪心,看是否可行

例題3:HDU 4430 數學+二分,這種題不常見,主要練習upper_bound,lower_bound

直接在一堆數裡搜答案,可以用upper_bound,lower_bound

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:

習題2:

JNUOJ 1151 方杯子,這個題目是我出的,是個公式題,修改一下資料提高一下需要的精度,就需要使用二分了,這個題可以不用做,看一下了解思路就行。

習題集:

見大白書P283

poj 3273

poj 3104

poj 3045

poj 2976

poj 3111

poj 3579

poj 3685

poj 2010

poj 3662

poj 1759

poj 3484