三分法讲解
二分用到的挺多,三分用的少,但也不能忘。。。
二分我們常常用于一個具有單調性的情況中求解某值
而三分就像是求一個凸性或凹形函數時,來求那個凹凸點
一開始L=0,R=inf,然后也是不斷縮小L與R的范圍,逼近最值點
這里面有兩個中間點mid1與mid2
mid1=(L+R)>>1
mid2=(mid1+R)>>1
然后判斷mid1與mid2的大小關系,從而縮小不同范圍
當while(L<R)不再滿足條件時,答案也就呼之欲出
詳細過程:
check()為三分的判斷函數
1.check(mid1)>check(mid2),我們可以得知最值點位于mid2的左側,我們通過R=mid2,將右邊界逼近來縮小范圍
因為如果mid1與mid2都在極點左側,check(mid1)就比check(mid2)小,不滿足條件。所以最值點只能在mid2左側
2.check(mid1)<check(mid2),我們可以得知最值點一定位于mid1的右側,我們將左邊界縮小,L=mid1
為什么?如果最極點位于mid1的左側,mid1<mid2,mid2也在右側,那check的結果比較就與條件沖突
這講的是凸形狀,還有凹形狀,正好相反
代碼:
凸形狀
兩種寫法:
這個題就可以用三分來做題目穿送
這里存一下二分的模板,沒地方放了
bool check(int mid){ …… return ……;} //模板一 找滿足某個條件的第一個數 int binary1(int l, int r) {while(l<r){int mid=(r+l)>>1;if(check(mid) r=mid;else l=mid+1;}return l; } //模板二 找滿足某個條件的最后一個數 int binary1(int l, int r) {while(l<r){int mid=(r+l+1)>>1;if(check(mid) l=mid;else r=mid-1;}return l; }總結
- 上一篇: 垃圾文件正在吞噬你的C盘空间!用这四种方
- 下一篇: 牛客IOI周赛16-普及组