1 .三分钟解决的问题说白了,三分法是最有价值的解决问题的方法。 所以那个可以解决以下问题
(两种说法等价) :
在定义域中,函数的导数是单调的。
函数是单峰的。
原理很简单,——取出求出的区间[ l,r ]中的两个值进行比较,一般使用中间值(mid=(LR )/2 )和中间值与右侧)的中间值) mid mid=(midr )/2 )进行比较。
若mid更大(小)则抛弃(midmid,r ] 这个区间
若midmid更大(小)则抛弃 [ l,mid)这个区间。
然后在剩下的区间找就可以了。
下图:
道理我很明白。 针对上图的情况直接选择[ L,midmid ]区间继续计算即可。
表示例题(HDU 2899 )
问题描述
Now,here is a fuction:
f(x )=6x78x67x35x2yx ) 0lt;=x lt;=100 ) f(x )=6*x^78*x^67*x^35*x^2-y*x ) 0lt;=x lt;=100 ) f(x )=6x78x67x3x2yx(0=x=100 ) ) ) ) ) ) ) ) ) ) ) ) )。
canyoufindtheminimumvaluewhenxisbetween0and 100。
输入
thefirstlineoftheinputcontainsanintegert (1=t=100 ) whichmeansthenumberoftestcases.thentlinesfollow,eachlinehasonlyonsonlyon
Output
justtheminimumvalue (accurate upto4decimal places ),when x is between 0 and 100。
# include cstdio # include cmath # includeiostreamusingnamespacestd; 双y; doubleFX(doublex ) return6*pow ) x,7.0 )8 * pow(x ) x,6.0 )7*pow ) x,3.0 ) pow ) x,2.0 )- y * x; }doubledfx(doublex ) return42*pow ) x,6 ) 48 * pow(x ) x,5 ) 21 * pow(x ) x,2 ) 10 * x - y; }doubleSanfen(doublel,double r ) doublemid=(Lr )/2; 双精度mid mid=(mid r )/2; if(r-L1e-6 )返回l; if(FX(mid ) FX (midmid ) ) returnSanfen,mid mid ); }else{returnSanfen(mid,r ); }}int main () {int T; scanf('%d ',t ); wile(t----) {cin y; (if ) dfx )0)//当时写的多余操作)勤奋的摩托车函数直接返回f(0) ) printf('%.4f(n ),FX ) ); }elseif(dfx(100 )0)/)恒减的函数直接返回f )0) )、FX ) 100 ) ); }else{printf('%.4f(n ),FX ) San fen (0,100 ) ); } }