LA5009三分法

 1 /*LA5009:
 2 定义 fi(x)=a[i]*x^2+b[i]*x+c[i](a[i]>=0),F(x)=max(fi(x)),0<=x<=1000
 3 求F(x)在区间上的最小值
 4 三分法模板题:总结一下:
 5 1、三分法适用类型,a:凹函数的最大值的最小值,b:凸函数的最小值的最大值。
 6 必须是单峰函数啊
 7 2、特点:升维,记住三分法不是用来解零点的
 8 3、解法:a类型,取三分点m1,m2,m1<m2,若F(m1)<F(m2) 则 解在(l,m2)上 ,否则在(m1,r)上
 9         b类型,解在靠近大的值得区间上
10 */
11 #include<iostream>
12 #include<stdio.h>
13 #include<string.h>
14 #include<algorithm>
15 #include<stdlib.h>
16 #include<cmath>
17 #include<queue>
18 #include<vector>
19 #include<map>
20 #define eps 1e-10
21 #define LL long long
22 using namespace std;
23 int n,T;
24 double a[10000+5],b[10000+5],c[10000+5];
25 double f(int i,double x)
26 {
27     return a[i]*x*x+b[i]*x+c[i];
28 }
29 
30 double F(double x)
31 {
32     double m=f(0,x);
33     for(int i=1;i<n;i++) m=max(m,f(i,x));
34     return m;
35 }
36 int main()
37 {
38     cin>>T;
39     for(int cas=1;cas<=T;cas++)
40     {
41         cin>>n;
42         for(int i=0;i<n;i++) cin>>a[i]>>b[i]>>c[i];
43         double l=0,r=1000;
44         while(r-l>eps)
45         {
46             double m1=l+(r-l)/3,m2=m1+(r-l)/3;
47             if (F(m1)<F(m2)) r=m2;else l=m1;
48         }
49         printf("%.4lf
",F(l));//注意最后输出的是函数值
50     }
51     return 0;
52 }
原文地址:https://www.cnblogs.com/little-w/p/3570277.html