日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

三分法讲解

發布時間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三分法讲解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

二分用到的挺多,三分用的少,但也不能忘。。。
二分我們常常用于一個具有單調性的情況中求解某值
而三分就像是求一個凸性或凹形函數時,來求那個凹凸點

一開始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的結果比較就與條件沖突

這講的是凸形狀,還有凹形狀,正好相反

代碼:

凸形狀
兩種寫法:

int three(int l,int r) //找凸點 { while(l < r-1) { int mid1 = (l+r)/2; int mid2 = (mid1+r)/2; if( check(mid1) > check(mid2) ) r = mid2; else l = mid1; } return f(l)>f(r)? l : r; } double three(double l,double r) { double mid1,mid2; while(r-l>=eps) { mid1=l+(r-l)/3; mid2=r-(r-l)/3; if(f(m1)<=f(m2)) l=mid1; else r=mid2; } return (mid1+mid2)/2; }

這個題就可以用三分來做題目穿送

這里存一下二分的模板,沒地方放了

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; }

總結

以上是生活随笔為你收集整理的三分法讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。