#1142 : 三分·三分求极值

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

这一次我们就简单一点了,题目在此:

在直角坐标系中有一条抛物线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

题目链接:https://hihocoder.com/problemset/problem/1142
【思路】

二分法作为分治中最常见的方法,适用于单调函数,逼近求解某点的值。但当函数是凸形函数时,二分法就无法适用,这时就需要用到三分法。
从三分法的名字中我们可以猜到,三分法是对于需要逼近的区间做三等分:

我们发现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 : 三分求极值相关推荐

  1. 算法题目——二次函数三分求极值(HDU-3714)

    题目链接:HDU-3714 题目描述: 对于N个二次函数,求每个二次函数的最小值中的最大值 思路: 使用三分法求极值(递归调用) 对于这种在指定区间里只有一个极值点的函数(凸函数凹函数都可以),我们可 ...

  2. Hihocoder 1142 三分

    描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d. 提示:三分法 在之前的几周中我们了解到二分法作为分治中最常 ...

  3. python求最值_用Python实现最速下降法求极值的方法

    对于一个多元函数 ,用最速下降法(又称梯度下降法)求其极小值的迭代格式为 其中 为负梯度方向,即最速下降方向,αkαk为搜索步长. 一般情况下,最优步长αkαk的确定要用到线性搜索技术,比如精确线性搜 ...

  4. 用Python实现最速下降法求极值

    原文:https://blog.csdn.net/u012705410/article/details/47254437 用Python实现最速下降法求极值 对于一个多元函数f(x)=f(x1,x2, ...

  5. matlab求曲线极值程序,matlab函数求极值matlab函数求极值.ppt

    matlab函数求极值matlab函数求极值 * * 函数的极值 1.一元函数的极值 函数命令:fminbnd 调用格式:[x,feval,exitflag,output]=fminbnd(fun,x ...

  6. matlab 局部极值点,matlab 图像局部求极值

    求极值的具体语句: 极值: data是你的数据, find(diff(sign(diff(data)))==-2)+1 找到极大值的位置 find(diff(sign(diff(data)))==2) ...

  7. 最优化方法:非线性方程的求极值方法

    http://blog.csdn.net/pipisorry/article/details/23553263 本文主要讲解 数值分析:非线性方程的求根方法,但是等价于最优化方法:非线性方程的求极值方 ...

  8. python迭代法求极值_用Python实现最速下降法求极值的方法

    对于一个多元函数 ,用最速下降法(又称梯度下降法)求其极小值的迭代格式为 其中 为负梯度方向,即最速下降方向,αkαk为搜索步长. 一般情况下,最优步长αkαk的确定要用到线性搜索技术,比如精确线性搜 ...

  9. matlab 图像 局部极值,[转载]matlab 图像局部求极值

    求极值的具体语句: 极值: data是你的数据, find(diff(sign(diff(data)))==-2)+1 找到极大值的位置 find(diff(sign(diff(data)))==2) ...

最新文章

  1. 将一张表的数据插入另外一张表
  2. 数组遍历VS对象遍历
  3. jquery插件dataTables自增序号。
  4. 前后端分离Java后端跨越问题解决
  5. js- 引用和复制(传值和传址)
  6. 父类子类的创建对象和实例化
  7. cloudflare-5s盾分析
  8. logback自定义日志配置
  9. Mac Osx X86 10.4.7,确实不错
  10. 嵌入式软件工程师学习路线
  11. android png 图标制作,ico图标怎么制作?png图片文件转换成ico图标文件的教程
  12. 美赛数模论文之优缺点写作
  13. Word2010版 ,每页上下都有一根粗黑线,但是不是页眉或页脚的下框线,怎么删除?
  14. sendfile详解
  15. Windows Azure实战pdf
  16. 常用jQuery web工具集4
  17. 如何看待996现象,996工作模式是种什么样的体验?
  18. GAMES-101-个人总结归纳-Shading
  19. 导入/导出dBase
  20. 你所不知道的粘接强度检测知识大全详解

热门文章

  1. java之Thread.sleep(long)与object.wait()/object.wait(long)的区别及相关概念梳理(good)
  2. dbms_rowid包的BUG问题
  3. Mysql之主从复制及主主复制
  4. django框架-DRF工程之认证功能
  5. 2 0 1 8 全球人工智能技术大会--邀请函
  6. Day2_and_Day3 文件操作
  7. elasticsearch系列(七)java定义score
  8. UITableView 表视图编辑
  9. WP8.1开发中复杂JSON绑定数据时的方法
  10. 状态保持中的cookie