二分用於單調函式, 三分用於凹凸函式.
三分就是把區間分成三份, 設左右端點為l和r, 有兩種分法。
第一種是區間內的第乙個點lmid = (l + r) / 2, 第二個點rmid = (lmid + r) / 2。
第二種是lmid = l + (r – l) / 3, rmid = l + 2 * (r – l) / 3。
然後判斷函式在這兩個位置的值,根據實際情況縮小答案的區間。
比如求凸函式最大值,如果f(lmid) < f(rmid), 則l = lmid,否則r = rmid。 然後迴圈一定次數保證精度,最後的r就是最大值點。 如果是整數三分,那就是l = lmid + 1,否則r = rmid - 1。 注意1e-5的精度至少64次,1e-6建議100次。 實數三分:
#include
using
namespace std;
typedef
long
long ll;
const
int maxn =
1e3+
5, mod =
1e9+7;
int n;
double a[15]
;doublef(
double x)
sum +
= a[i]
* prod;
}return sum;
}int
main()
cout << fixed <<
setprecision(5
)<< r << endl;
return0;
}
整數三分:
這裡有個小技巧,為什麼要r – l > 3呢,是為了防止l和r離的太近使得l或r直接跳過了極值點,二分不會出現這樣的問題,最後求出來的[l, r]是乙個區間,極值點一定在這個區間裡,挨個暴力就好了,可以根據不同的題適當改變區間大小,這樣check函式不需要那麼嚴格。
int l = mi, r = ma;
while
(r - l >3)
三分法求解凸函式的最值
轉了牛人的 二分法作為分治中最常見的方法,適用於單調函式,逼近求解某點的值。但當函式是凸性函式時,二分法就無法適用,這時三分法就可以 大顯身手 如圖,類似二分的定義left和right,mid left right 2,midmid mid right 2 如果mid靠近極值點,則right mid...
三分求單峰函式最值
二分可以求解單調函式最值,模擬不難想到三分可以求解單峰函式。何為單峰函式,如果函式f x 在區間 a,b 上只有唯一的最大值點 或最小值點 c,而在最大值點 或最小值點 c的左側,函式單調增加 減少 在點c的右側,函式單調減少 增加 則稱這個函式為區間 a,b 上的單峰函式 如果函式f x 在區間 ...
三分求極值
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述 這一次我們就簡單一點了,題目在此 在直角座標系中有一條拋物線y ax 2 bx c和乙個點p x,y 求點p到拋物線的最短距離d。輸入第1行 5個整數a,b,c,x,y。前三個數構成拋物線的引數,後兩個數x,y表示p點座...