三分搜索-ZOJ LightBulb
开始算法基础学习的第一天
今天学习的内容是三分搜索 相对来说很基础的内容(还是觉得脑子不够用)
三分搜索主要用于凸函数查找极大值。
(盗个图)
如图所示 若要查找该函数的最大值 可以考虑和二分法一样的思路,即用L,R两个端点去不断地逼近这个最大点
但是在这里仅用一个mid中值是不够的 因此添加了一个mmid = (mid+R)/2 判断函数在mid和mmid两点的大小就可以进一步判断极值存在于哪一段中
用一个便于理解的办法,我们分成以下两种情况来讨论:
1.mid,mmid在最大值的同一侧:这时更大的那个值更接近极值 比如mid>mmid那么就可以确定(mmid,R)区间内肯定没有极值,因此抛弃它
2.mid,mmid在最大值的两侧:依然是更大的那个值更接近极值 比如mid>mmid那么也可以确定(mmid,R)区间内肯定没有极值
综上 我们判断mid,mmid两点函数值的大小来缩短区间 逼近极值点(具体见代码)
/*三分搜索实例--ZOJ3203:LightBulb*/
# include<iostream> using namespace std; const double EPS = 1e-;//设定精度 double D, H, h;//为了方便计算写成了全局变量 double calc(double x)
{
return (D - x) + H - D*(H - h) / x;
}//clac函数。根据几何关系推导。 double ternarysearch(double l, double r)
{
double mid,mmid; while (l + EPS < r)
{
mid = (l + r) / ;
mmid = (mid + r) / ; double mid_value = calc(mid);
double mmid_value = calc(mmid); if (mid_value > mmid_value)
r = mmid;
else
l = mid;
} return l;
}//三分搜索主体部分 int main()
{
int T;
double target; cin >> T; while (T--)
{
cin >> H >> h >> D; target = ternarysearch(D-D*h/H,D);//注意开始的两个点的取值 printf("%.3f\n", calc(target)); } return ;
}
对于一道题目 关键还是写出calc函数。。
三分搜索-ZOJ LightBulb的更多相关文章
- hdu 4355 Party All the Time(三分搜索)
Problem Description In the Dark forest, there is a Fairy kingdom where all the spirits will go toget ...
- Weakness and Poorness CodeForces - 578C 三分搜索 (精度!)
You are given a sequence of n integers a1, a2, ..., an. Determine a real number x such that the weak ...
- Codeforces Gym101246J:Buoys(三分搜索)
http://codeforces.com/gym/101246/problem/J 题意:给出n个点坐标,要使这些点间距相同的话,就要移动这些点,问最少的需要的移动距离是多少,并输出移动后的坐标. ...
- Codeforces 782B:The Meeting Place Cannot Be Changed(三分搜索)
http://codeforces.com/contest/782/problem/B 题意:有n个人,每个人有一个位置和速度,现在要让这n个人都走到同一个位置,问最少需要的时间是多少. 思路:看上去 ...
- [ACM_搜索] ZOJ 1103 || POJ 2415 Hike on a Graph (带条件移动3盘子到同一位置的最少步数 广搜)
Description "Hike on a Graph" is a game that is played on a board on which an undirected g ...
- 三分套三分 --- HDU 3400 Line belt
Line belt Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3400 Mean: 给出两条平行的线段AB, CD,然后一 ...
- poj 3301 Texas Trip(几何+三分)
Description After a day trip with his friend Dick, Harry noticed a strange pattern of tiny holes in ...
- hdu3756 三分求最小圆锥
题意: 让你找到一个最小的圆柱去覆盖所有的竖直的线段.. 思路: 三分,直接去三分他的半径,因为想下,如果某个半径是最优值,那么 从R(MAX->now->MIN) ...
- Soj题目分类
-----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...
随机推荐
- C++二维数组讲解、二维数组的声明和初始化
我们知道,一维空间是一条线,数学中用一条数轴来表达:二维空间是一个平面,数学中用平面坐标系来表达.那么二维数组又是什么样的呢? 线与面 我们用一个下标来描述一维数组中的某个元素,就好像在用数描述一条线 ...
- centos 搭建 搭建uwsgi服务
1. 安装linux系统所需的一些软件依赖 yum groupinstall "Development tools" yum install openssl openssl-dev ...
- quartus ii工程文件的分析
.pof:通过AS口将程序固化到EPCS(flash)内. .sof:通过JTAG口下载到FPGA内部的SRAM里面. .JIC:通过JTAG口将程序固化到EPCS(flash)内.
- Apach 配置虚拟机时候DocumentRoot参数最后不要加斜杠
DocumentRoot "D:\baiduyun\webroot\jedi\app\static" 这样是可以的 DocumentRoot "D:\baiduyun\w ...
- C# WINFORM判断程序是否运行,且只能运行一个实例(转)
判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种, 方法1:线程互斥 static class Program { private static System.Threading. ...
- Mysql 比较运算符详解
熟悉了最简单的算术运算符,再来看一下比较运算符.当使用SELECT 语句进行查询时,MySQL允许用户对表达式的左边操作数和右边操作数进行比较,比较结果为真,则返回1,为假则返回0,比较结果不确定则返 ...
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof
JVM性能调优监控工具jps.jstack.jmap.jhat.jstat.hprof
- makefile之wildcard函数
$(wildcard PATTERN) 函数功能: 获取匹配 PATTERN 的所有对象 返回值: 使用空格分割的匹配对象列表 1. 示例1
- filter函数和map函数
filter filter()函数接收一个函数 f 和一个可迭代对象,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返 ...
- JS中同步与异步的理解
你应该知道,javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条流水线,仅仅是一条流 ...