三分

来源:互联网 发布:流星网络电视看不了 编辑:程序博客网 时间:2024/05/17 07:47

问题描述:
给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减。试求出x的值。
代码:

double coe[20];//记录系数int n;//次数double calc(double x)//计算函数值{    double ans = 0;    int m = n;    for(int i = 1; i <= n; ++i)    {        ans += coe[i] * pow(x,m);//系数 * x ^ m        m--;    }    ans += coe[n + 1];//加上常数项    return ans;}int main(){    double l,r;//区间端点    cin >> n >> l >> r;//输入    for(int i = 1; i <= n + 1; ++i)        scanf("%lf",&coe[i]);    double midl,midr;//靠近左端点的三分点,靠近右端点的三分点    while(r - l > 1e-8)//精度1e-8    {        midl = (2 * l + r) / 3;//计算三分点        midr = (l + 2 * r) / 3;//计算三分点        if(calc(midl) < calc(midr))// 注意逻辑!!!            l = midl;        else            r = midr;    }    printf("%.5lf\n",(l + r) / 2);//打印    return 0;}

对于整型凸性函数:

while(l < r - 1){    int midl = (2 * l + r) / 3;    int midr = (l + 2 * r) / 3;    if(calc(midl) < calc(midr))        l = midl;    else        r = midr;}int ans = max(calc(l),calc(r));

解决方法:
midl与midr在最值的异侧,由于函数在最大值两侧都具有单调性,因此较大的三分点更接近最大值,所以要抛弃距离最大值远的那个区间
解决求最大值最小值问题
常用分析方法:极限法
注意:实型数据要用double来保存

原创粉丝点击