三分 求凹凸函式最值

2021-10-13 20:58:08 字數 1064 閱讀 2099

二分用於單調函式, 三分用於凹凸函式.

三分就是把區間分成三份, 設左右端點為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點座...