zoukankan      html  css  js  c++  java
  • 三分法

    二分查找适用于单调函数中逼近求解某点的值

    三分查找则用于抛物线(凸性函数),通俗来讲,就是该序列必须有一个最大值(或最小值),在最大值(最小值)的左侧序列,必须满足单调递增(递减),右侧序列必须满足单调递减(递增)。如下图,表示一个有最大值的凸性函数:



    三分算法是将区间分为两部分进行比较
    三分算法则有两种不同分法
    1.将区间均等三分
    ll=l+(r-l)/3=(2l+r)/3
    rr=r-(r-l)/3=(l+2r)/3
    2.两次平分
    mid = (left + right) / 2;
    midmid = (mid + right) / 2;
    两种方法都可以得到正确结果


    模板:

    double ternarysearch(double l,double r)
    {
        while(r-l>eps)
        {
            ll=(r+l*2.0)/3.0;
            rr=(r*2.0+l)/3.0;
            if(cal(ll)<cal(rr))
                l=ll;
            else
                r=rr;
        }
        return (l+r)/2;
    }



    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2438

    题意:已知汽车的长和宽,l和w,以及俩条路的宽为x和y,汽车所处道路宽为x ,问汽车能否顺利转弯?

    分析:汽车能否顺利转弯取决于在极限情况下,随着角度的变化,汽车离对面路的距离是否大于等于0

    如图中

    在上图中需要计算转弯过程中h 的最大值是否小于等于y

    很明显,随着角度θ的增大,最大高度h先增长后减小,即为凸性函数,可以用三分法来求解

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #define pi 3.141592653
    using namespace std;
    double x,y,l,w,ll,rr;
    double f(double a)
    {
        double s,h;
        s=l*cos(a)+w*sin(a)-x;
        h=s*tan(a)+w*cos(a);
        return h;
    }
    int main()
    {
        while(cin>>x>>y>>l>>w)
        {
            double left=0.0,right=pi/2;
            while(fabs(right-left)>1e-9)
            {
                ll=(left*2.0+right)/3.0;
                rr=(left+right*2.0)/3.0;
                if(f(ll)<f(rr))
                    left=ll;
                else
                    right=rr;
            }
            if(f(left)<=y)
                cout<<"yes"<<endl;
            else
                cout<<"no"<<endl;
        }
        return 0;
    }
    


  • 相关阅读:
    有关HL7 的C# 源码
    EF中调整字段的顺序
    xml schema 中如何定义类似Map的结构
    js将时间转换为时间戳
    postman使用
    H5拖拽
    读取XML文件中获取特定值
    读取XML文件
    owin使用
    C#跨线程访问
  • 原文地址:https://www.cnblogs.com/wolf940509/p/6617102.html
Copyright © 2011-2022 走看看