這道題其實是可以二分的,但是有更好的演算法,叫做三分。
三分這種演算法用於求單峰函式的最大值或者最小值。
演算法思想就是弄\((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 必為原函式的乙個極大值或極小值 求駐點和零點 注 此題不含駐點 題目...