1. 程式人生 > >三分法learning

三分法learning

二分法 分享 最值 函數 模板題 -1 sin ont clu

三分法和二分法有些類似,二分處理的是遞增/減的函數,而三分處理的是先遞增後遞減(或相反)的函數的最值。

技術分享

int lm=l+(r-l)/3,rm=r-(r-l)/3;

如上圖,lm<rm,則函數最小值在[l,rm]間,再繼續三分即可。

技術分享

反向也是同理,如上圖,最大值在[lm,r]之間。

現在我們來做一道模板題:給一函數,該函數在任意Y>0的情況下x在[0,100]內有極小值,求之。

技術分享

按照思路套上代碼即可,代碼如下:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4
#define eps 1e-7 5 using namespace std; 6 double y; 7 double val(double x){ 8 return 6*x*x*x*x*x*x*x+8*x*x*x*x*x*x+7*x*x*x+5*x*x-y*x; 9 } 10 double solve(double l,double r){ 11 while(l+eps<r){ 12 double lm=l+(r-l)/3,rm=r-(r-l)/3; 13 if(val(lm)<val(rm)) r=rm; 14 else
l=lm; 15 } 16 return val(l); 17 } 18 int main() 19 { 20 int T; scanf("%d",&T); 21 while(T--){ 22 scanf("%lf",&y); 23 printf("%.4lf\n",solve(0,100.0)); 24 } 25 }

三分法learning