思想转载自:http://blog.csdn.net/pi9nc/article/details/9666627

如果遇到凸性或凹形函数时,可以用三分查找求那个凸点或凹点。


如图所示,已知左右端点L、R,要求找到白点的位置。
思路:通过不断缩小 [L,R] 的范围,无限逼近白点。
做法:先取 [L,R] 的中点 mid,再取 [mid,R] 的中点 mmid,通过比较 f(mid) 与 f(mmid) 的大小来缩小范围。
           当最后 L=R-1 时,再比较下这两个点的值,我们就找到了答案。
1、当 f(mid) > f(mmid) 的时候,我们可以断定 mmid 一定在白点的右边。
反证法:假设 mmid 在白点的左边,则 mid 也一定在白点的左边,又由 f(mid) > f(mmid) 可推出 mmid < mid,与已知矛盾,故假设不成立。
所以,此时可以将 R = mmid 来缩小范围。
2、当 f(mid) < f(mmid) 的时候,我们可以断定 mid 一定在白点的左边。
反证法:假设 mid 在白点的右边,则 mmid 也一定在白点的右边,又由 f(mid) < f(mmid) 可推出 mid > mmid,与已知矛盾,故假设不成立。

同理: 当求凹点的时候,当f(m) >  f(mm)的时候 ,L =m;
                                             当f(m) < f(mm) 的时候,R = mm;证明与上面一般;

zoj3203:

题意:

人左右走动,求影子L的最长长度。

思路:求最长的影子长度;

设x为人灯光垂直线的距离,那么有两个边界,一个是当影子刚好射到墙角的时候,即x = h / H * D ,一个是全都投射到墙上的情况即x = D;

这个肯定在中间的某个位置最长,利用calc(x)公式求出最长的长度,calc公式推导如下:

可以得出L=  H - D * (H - h)/x +D -x,不过得注意x的起点是从h / H * D 开始的;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 100000 + 10;
#define INF 0x7fffffff
#define clr(x,y) memset(x,y,sizeof(x))
typedef long long ll;
#define eps 10e-10
double H,h,D;double calc(double x)
{return H - D * (H - h)/x +D -x;
}
int main()
{int Tcase;scanf("%d",&Tcase);while(Tcase --){scanf("%lf%lf%lf",&H,&h,&D);double l = D - h /H * D,r = D;while(l + eps < r){double m = (l + r) / 2, mm = (m + r) /2;if(calc(m) < calc(mm)){l = m;}else{r = mm;}}printf("%.3lf\n",calc(l));}return 0;
}

当然还有数学方法可以解决这个题:

公式为:L = H + D - ((H - h)*D /x + x),你会发现这就是一个双勾函数,只要把这个函数的最小值,L的最大值就能求出来了,双勾函数的性质,对于一个双勾函数: a*x + b / x .(a> 0 && b > 0)

然后判断一下边界取出最小值代入得到最大值。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 100000 + 10;
#define INF 0x7fffffff
#define clr(x,y) memset(x,y,sizeof(x))
typedef long long ll;
#define eps 10e-10
double H,h,D;double calc(double x)
{return H + D - ((H - h)*D /x + x);
}
int main()
{int Tcase;scanf("%d",&Tcase);while(Tcase --){scanf("%lf%lf%lf",&H,&h,&D);double xm = sqrt(D*(H - h));double l = D - h / H * D,r = D;double ans;if(l <= xm && r >= xm)ans = calc(xm);else if(xm < l)ans = calc(l);else ans = calc(r);printf("%.3lf\n",ans);}return 0;
}

HDU 2438

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

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

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

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

如图中:

这题转载自http://www.cnblogs.com/nanke/archive/2012/02/12/2348041.html

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 1000000 + 10;
#define INF 0x7fffffff
#define clr(x,y) memset(x,y,sizeof(x))
typedef long long ll;
#define eps 10e-10
double x,y,l,w;
double calc_h(double angle)
{double s = l * cos(angle) + w *sin(angle) - x;return s * tan(angle) + w * cos(angle);
}
int main()
{while( ~ scanf("%lf%lf%lf%lf",&x,&y,&l,&w)){double L = 0,R = acos(-1.0)/2;while(L + eps < R){double m = (L + R) / 2,mm = (m + R)/2;if(calc_h(m) < calc_h(mm)){L = m;}else R = mm;}double max_h = calc_h(L);if(max_h <= y){cout << "yes" << endl;}else cout << "no" << endl;}return 0;
}

三分学习(解决凸函数or凹函数的极值)相关推荐

  1. 科技爱好者周刊(第 129 期):创业的凸函数和凹函数

    这里记录每周值得分享的科技内容,周五发布. 本杂志开源(GitHub: ruanyf/weekly),欢迎提交 issue,投稿或推荐科技内容. 周刊讨论区的帖子<谁在招人?>,提供大量就 ...

  2. OpenAI透露GPT-4动向:文本与视觉融合,人类反馈+强化学习解决安全问题 | AI日报...

    图灵奖得主JudeaPearl联手21名学者发表公开信,要求重塑学术界「言论自由」 科学需要「自由」吗?至少,以图灵奖得主Judea Pearl,国际机器学习协会的联合创始人之一Pedro Domin ...

  3. 谷歌开放语音命令数据集,助力初学者利用深度学习解决音频识别问题

    语音命令数据集地址:http://download.tensorflow.org/data/speech_commands_v0.01.tar.gz 音频识别教程地址:https://www.tens ...

  4. ABP学习 解决:Update-Database : 无法将“Update-Database”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的问题

    ABP学习 解决:Update-Database : 无法将"Update-Database"项识别为 cmdlet.函数.脚本文件或可运行程序的名称的问题 参考文章: (1)AB ...

  5. 用深度学习解决大规模文本分类问题

     用深度学习解决大规模文本分类问题 人工智能头条 2017-03-27 22:14:22 淘宝 阅读(228) 评论(0) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者 ...

  6. 步步为营!高手教你如何有效使用深度学习解决实际问题

    来自法国 Capgemini Invent 公司的高级数据科学家 Ahmed BESBES 三个月前参加了一个其公司内部的比赛:使用机器学习方法帮助海洋科学家更好的识别鲸鱼,根据鲸尾页突的外观作为主要 ...

  7. android 学习 解决R.java不能自动生成问题,编译时adb.exe 找不到问题

    android 学习 解决R.java不能自动生成问题,编译时adb.exe 找不到问题 参考文章: (1)android 学习 解决R.java不能自动生成问题,编译时adb.exe 找不到问题 ( ...

  8. 深度学习解决NLP问题:语义相似度计算

    深度学习解决NLP问题:语义相似度计算 参考文章: (1)深度学习解决NLP问题:语义相似度计算 (2)https://www.cnblogs.com/qniguoym/p/7772561.html ...

  9. 深度学习解决机器阅读理解任务的研究进展

    /*版权声明:可以任意转载,转载时请标明文章原始出处和作者信息.*/ author: 张俊林 关于阅读理解,相信大家都不陌生,我们接受的传统语文教育中阅读理解是非常常规的考试内容,一般形式就是给你一篇 ...

  10. 常见的几个凸函数与凹函数

    参照 <convex optimization>这本书,总结几个常见的凸函数和凹函数. (定义域与参数都是实数). 指数函数 eaxe^{ax}eax 为凸函数 **- 幂函数 xax^{ ...

最新文章

  1. Bert时代的创新:Bert应用模式比较及其它 | 技术头条
  2. 读取Excel表格数据到DataGridView中
  3. 【CyberSecurityLearning 4】NTFS安全权限及文件共享服务器
  4. Oracle数据处理
  5. Cocos2d-x 3.1.1 Lua演示样例 ActionManagerTest(动作管理)
  6. Opencv——DFT变换(实现两个Mat的卷积以及显示Mat的频域图像)
  7. 记录一次在centos下使用gmp的悲伤
  8. perl system函数返回值问题
  9. ScheduledExecutorService延时线程池的简单使用
  10. 介绍一下115sha1链接使用方法
  11. vue3笔记(乱七芭蕉更新中)
  12. Python实现日周月排行榜
  13. java simon_Java Simon
  14. 【MySQL】——事务的基本概念
  15. 农作物病虫害AI智能监测预警系统
  16. 2021秋冬上海时装周开启,聚焦8大国内外品牌
  17. 京东X无人超市落户西安大雁塔 全球首个5A景区店诞生
  18. windows10防火墙设置
  19. QT安装教程(简易)
  20. 完美世界广告萨克斯背景音乐

热门文章

  1. canvas 实现截图功能——截取图片的一部分
  2. 手动链接react native的依赖
  3. 网页游戏未来发展的一些趋势
  4. 浅谈垂心四面体的垂心组
  5. 《Python编程:从入门到实践》练习16-2:比较锡特卡和死亡谷的温度
  6. Cannot lock file hash cache (E:\blackWu\github\X5WebView\WebViewX5\.gradle\4.6\fileHashes) as it has
  7. Sap hana 升级思路
  8. 正则正数,负数,整数,浮点数校验大全
  9. JavaWeb——HTTP协议TomcatServlet学习笔记
  10. 小程序苹果手机底部出现横杠处理