1.3二分演算法

daydreamer_zcxnb發表於2024-09-06

演算法理解

二分用於解決答案具有單調性問題(經典最大值最小問題),是一個好的入手點,用一個log的複雜度,將求解答案轉化成了判斷答案是否合法

實數域上的二分

兩種方法:確定精度eps,固定列舉次數,一般後者精度大於前者

T1:

二分最大值,注:如果有一個數本身就大於二分答案,則答案肯定錯誤,證明:考慮如果只有一個數大於二分答案,其餘都正常,可能就會小於分段數,導致答案錯誤

T2:(T_T)

單純列舉位置判斷這個位置上防具奇偶是不具有單調性的,考慮只有一個位置為奇或全為偶,如何想到的呢:我們先判斷是這兩種情況的哪一種,顯然,如果全部防具加起來為偶,則全為偶,反之則有一雞,我們可以將這個結論推廣,在二分的位置x時,若0~x中有總防具為雞,則防具個數為雞的位置必然在前面,反之則在後面,具有單調性

T3:(T_T)

實數內二分平均數,判定是否存在一個長度不小於L的數列,平均數不小於mid,存在性問題,找極端值,就是找平均數最大的序列,平均數是用段的和除以元素個數,我們想只統計段的和,所以,考慮將每一個數都減去平均數,現在問題就轉化成了維護一段長度不小於L的和的最大值,考慮統計字首和,問題又變成了找到對於一個右端點為i的區間,找到一個0~i-L中的最小字首和,它們相減就是這段的和,找到最大的和,判斷它是否大於等於0,是,則存在這樣一個序列,具有單調性

T4:

二分選多少寵物,n<50,亂搞即可

T5:

同上題,找到前m大的數,但複雜度太高了,瓶頸在sort排序,考慮將排序最佳化到O(n),用一種新奇的STL:

std::nth_element(a+1,a+m,a+n+1,cmp);

用法詳見OI viki
注:a+m指的是a[m]

相關文章