P3382 模板 三分法

2022-08-13 00:42:17 字數 1452 閱讀 1384

這道題其實是可以二分的,但是有更好的演算法,叫做三分。

三分這種演算法用於求單峰函式的最大值或者最小值。

演算法思想就是弄\((l, r)\)區間的兩個三等分點,然後來縮小範圍。

因為這道題是求峰頂,所以我們可以模擬退火通過兩個三等分點的大小關係來縮小範圍。

我們把那個值小的那邊的範圍弄掉,慢慢我們就會到達峰頂。

還有另外一種也聽容易的做法:求導後二分導函式。這個沒什麼難度。

這道題的函式是個\(n\)次的函式,也就是個\(n\)次的多項式,我們可以用秦九韶演算法來優化。

當然,模擬退火是真的可以做的。這個坑等以後來填。。。

upd in oct 2nd:隔天我就把模擬退火的搞好啦!真香!

\[a_nx^n+a_x^+a_x^+...+a_2x^2+a_1x+a_0=0

\]\[y'=na_nx^+(n-1)a_x^+(n-2)a_x^+...+2a_2x+a_1

\]**:

第乙份:求導二分求零點的。

#include#includeconst int maxn = 17;

const double eps = 1e-6;

int n;

double l, r;

double a[maxn];

double fd(double x)

return ans;

}int main()

printf("%.5lf\n", l);

return 0;

}

第二份:三分法。

#include#includeconst int maxn = 17;

const double eps = 1e-6;

int n;

double l, r;

double a[maxn];

double f(double x)

int main()

printf("%.5lf\n", l);

return 0;

}

第三種做法:模擬退火。

#include#include#includeconst int maxn = 20;

const double inf = 9999999999;

const double delta = 0.99;

int n;

double l, r;

double ans = -inf, ansx;

double a[maxn];

double f(double x)

double ff(double x)

void sa()

else if(exp(-de / t) * rand_max > rand())

t = t * delta;

}}int main()

P3382 模板 三分法

這是一道版子題 一開始看了別人的部落格,知道三分方法 後來自己實現 交了兩次,全wa。原因是係數定義成了int.唉樣例竟然過了 第三次就全ac了 沒啥思維含量,不過學到了 fabs 和 判斷精度 今天xmz問我一本通的 也用到了精度判斷 三分 include include include incl...

題解 P3382 模板 三分法

本題使用充滿mo力的mo你退火 關於模擬退火,ta。看到這單峰函式,猛地意識到模擬退火基本可以a掉,而靈魂 else 是不需要的。要也沒事 includeusing namespace std int n double x 15 double ansx,ans 1e18 7,temperature ...

洛谷P3382 模板 三分法

題目鏈結 普通的求多項式 double f double x return f 秦九韶演算法從裡到外逐層計算一次多項式的值 double f double x 微積分求導 易證,若f x 0且f x dx f x dx 0則f x 必為原函式的乙個極大值或極小值 求駐點和零點 注 此題不含駐點 題目...