hihoCoder #1142 : 三分求极值
#1142 : 三分·三分求极值
描述
这一次我们就简单一点了,题目在此:
在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d。
提示:三分法
输入
第1行:5个整数a,b,c,x,y。前三个数构成抛物线的参数,后两个数x,y表示P点坐标。-200≤a,b,c,x,y≤200
输出
第1行:1个实数d,保留3位小数(四舍五入)
- 样例输入
-
2 8 2 -2 6
- 样例输出
-
2.437
二分法作为分治中最常见的方法,适用于单调函数,逼近求解某点的值。但当函数是凸形函数时,二分法就无法适用,这时就需要用到三分法。
从三分法的名字中我们可以猜到,三分法是对于需要逼近的区间做三等分:
我们发现lm这个点比rm要低,那么我们要找的最小点一定在[left,rm]之间。如果最低点在[rm,right]之间,就会出现在rm左右都有比他低的点,这显然是不可能的。 同理,当rm比lm低时,最低点一定在[lm,right]的区间内。利用这个性质,我们就可以在缩小区间的同时向目标点逼近,从而得到极值。
接下来我们回到题目上,抛物线和点之间的距离可以简单的用直线公式计算:即d = min{sqrt((X - x)^2+(aX^2+bX+c-y)^2)}该公式展开后为4次,需要采用求导等方法来求极值。对于计算机编程来说是很麻烦的一件事。
进一步观察题目,我们可以发现根据带入的X值不同,d的长度恰好满足凸形函数。而我们要求的最短距离d,正好就是这个凸形函数的极值。那么三分法不就正好可以用来解决这道题目了么?需要注意在解题过程中一定要想清楚如何划分区间,我们求的各个变量到底是什么含义。
下面给出AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 double a,b,c; 4 const double eps=1e-4; 5 const double minn=-200; 6 const double maxn=200; 7 double x,y; 8 double solve(double X) 9 { 10 return sqrt((X-x)*(X-x)+(a*X*X+b*X+c-y)*(a*X*X+b*X+c-y)); 11 } 12 int main() 13 { 14 while(scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&x,&y)!=EOF) 15 { 16 double l=minn,r=maxn,midx,midy; 17 while(r-l>eps) 18 { 19 midx=(l+l+r)/3; 20 midy=(l+r+r)/3; 21 if(solve(midx)<=solve(midy)) 22 r=midy; 23 else l=midx; 24 } 25 printf("%.3lf\n",solve(l)); 26 } 27 return 0; 28 }
转载于:https://www.cnblogs.com/ECJTUACM-873284962/p/6568882.html
hihoCoder #1142 : 三分求极值相关推荐
- 算法题目——二次函数三分求极值(HDU-3714)
题目链接:HDU-3714 题目描述: 对于N个二次函数,求每个二次函数的最小值中的最大值 思路: 使用三分法求极值(递归调用) 对于这种在指定区间里只有一个极值点的函数(凸函数凹函数都可以),我们可 ...
- Hihocoder 1142 三分
描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d. 提示:三分法 在之前的几周中我们了解到二分法作为分治中最常 ...
- python求最值_用Python实现最速下降法求极值的方法
对于一个多元函数 ,用最速下降法(又称梯度下降法)求其极小值的迭代格式为 其中 为负梯度方向,即最速下降方向,αkαk为搜索步长. 一般情况下,最优步长αkαk的确定要用到线性搜索技术,比如精确线性搜 ...
- 用Python实现最速下降法求极值
原文:https://blog.csdn.net/u012705410/article/details/47254437 用Python实现最速下降法求极值 对于一个多元函数f(x)=f(x1,x2, ...
- matlab求曲线极值程序,matlab函数求极值matlab函数求极值.ppt
matlab函数求极值matlab函数求极值 * * 函数的极值 1.一元函数的极值 函数命令:fminbnd 调用格式:[x,feval,exitflag,output]=fminbnd(fun,x ...
- matlab 局部极值点,matlab 图像局部求极值
求极值的具体语句: 极值: data是你的数据, find(diff(sign(diff(data)))==-2)+1 找到极大值的位置 find(diff(sign(diff(data)))==2) ...
- 最优化方法:非线性方程的求极值方法
http://blog.csdn.net/pipisorry/article/details/23553263 本文主要讲解 数值分析:非线性方程的求根方法,但是等价于最优化方法:非线性方程的求极值方 ...
- python迭代法求极值_用Python实现最速下降法求极值的方法
对于一个多元函数 ,用最速下降法(又称梯度下降法)求其极小值的迭代格式为 其中 为负梯度方向,即最速下降方向,αkαk为搜索步长. 一般情况下,最优步长αkαk的确定要用到线性搜索技术,比如精确线性搜 ...
- matlab 图像 局部极值,[转载]matlab 图像局部求极值
求极值的具体语句: 极值: data是你的数据, find(diff(sign(diff(data)))==-2)+1 找到极大值的位置 find(diff(sign(diff(data)))==2) ...
最新文章
- 将一张表的数据插入另外一张表
- 数组遍历VS对象遍历
- jquery插件dataTables自增序号。
- 前后端分离Java后端跨越问题解决
- js- 引用和复制(传值和传址)
- 父类子类的创建对象和实例化
- cloudflare-5s盾分析
- logback自定义日志配置
- Mac Osx X86 10.4.7,确实不错
- 嵌入式软件工程师学习路线
- android png 图标制作,ico图标怎么制作?png图片文件转换成ico图标文件的教程
- 美赛数模论文之优缺点写作
- Word2010版 ,每页上下都有一根粗黑线,但是不是页眉或页脚的下框线,怎么删除?
- sendfile详解
- Windows Azure实战pdf
- 常用jQuery web工具集4
- 如何看待996现象,996工作模式是种什么样的体验?
- GAMES-101-个人总结归纳-Shading
- 导入/导出dBase
- 你所不知道的粘接强度检测知识大全详解
热门文章
- java之Thread.sleep(long)与object.wait()/object.wait(long)的区别及相关概念梳理(good)
- dbms_rowid包的BUG问题
- Mysql之主从复制及主主复制
- django框架-DRF工程之认证功能
- 2 0 1 8 全球人工智能技术大会--邀请函
- Day2_and_Day3 文件操作
- elasticsearch系列(七)java定义score
- UITableView 表视图编辑
- WP8.1开发中复杂JSON绑定数据时的方法
- 状态保持中的cookie