三分法
来源:互联网 发布:python for android 编辑:程序博客网 时间:2024/06/11 10:50
二分查找适用于单调函数中逼近求解某点的值
三分查找则用于抛物线(凸性函数),通俗来讲,就是该序列必须有一个最大值(或最小值),在最大值(最小值)的左侧序列,必须满足单调递增(递减),右侧序列必须满足单调递减(递增)。如下图,表示一个有最大值的凸性函数:
三分算法是将区间分为两部分进行比较
三分算法则有两种不同分法
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.141592653using 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;}
0 0
- 三分法
- 三分法
- 三分法
- 三分法
- 三分法
- 三分法
- 三分法
- 三分法
- 三分法
- 三分法
- 三分法
- 三分法
- 三分法
- 二分法、三分法
- 三分法模板
- zoj3203(三分法)
- hdu4445(三分法)
- hdu3714(三分法)
- java jdk1.6内置支持的webservice使用示例
- iOS开发中的网络请求
- 找出一条走棋线路到第m使所有格子的权值之和最大
- 学习的饼越摊越大了!!!
- 如何在电脑上调试安卓手机HTML界面
- 三分法
- break使用浅谈
- Compiling OpenSSL with MinGW
- 计算机系统知识总结
- 数据库锁相关
- POJ 1067 取石子游戏
- 斐波那契之兔子问题解释
- python time模块详解
- 【转】用socket实现聊天室功能