A. Light Bulb

Time Limit: 1000ms
Case Time Limit: 1000ms
Memory Limit: 32768KB
 
64-bit integer IO format: %lld      Java class name: Main
 

Compared to wildleopard's wealthiness, his brother mildleopard is rather poor. His house is narrow and he has only one light bulb in his house. Every night, he is wandering in his incommodious house, thinking of how to earn more money. One day, he found that the length of his shadow was changing from time to time while walking between the light bulb and the wall of his house. A sudden thought ran through his mind and he wanted to know the maximum length of his shadow.

Input

The first line of the input contains an integer T (T <= 100), indicating the number of cases.

Each test case contains three real numbers Hh and D in one line. H is the height of the light bulb while h is the height of mildleopard. D is distance between the light bulb and the wall. All numbers are in range from 10-2 to 103, both inclusive, and H -h >= 10-2.

Output

For each test case, output the maximum length of mildleopard's shadow in one line, accurate up to three decimal places..

Sample Input

3
2 1 0.5
2 0.5 3
4 3 4

Sample Output

1.000
0.750
4.000 解题:好吧,比较喜欢数学解法,速度快嘛。。。参阅某神的代码。。。

算法:利用函数的凸性

 
 

思路一:

 
 
 L = 0 时,倾斜角越小 shadow 越长
所以 L 正好为 0 时,  X 的长度为左极限 
 
(H-h)/ X = H / D 
 
所以 X =  (H-h)*D / H ,left = X = (H-h)*D / H
 
明显可以看到右边的极限就是 X = D , 从而 right = D
 
也就是如果用所谓的三分法 X 的取值区间是 【left, right】
 
下面再分析假设 X 已经知道了,如何求出 shadow = D-X+L
 
 
L / H = ? / (D + ?) ..........................................(1)
 
tan(a) = L / ? = (H-h) / X  可以得到 ? = L *X / (H-h) 带入 (1)
 
可以得到 L = H - D*(H-h)/ X
 
所以 shadow = D - X + L = D+H - 【X+ (H-h)*D / X】
 
要使得 shadow 最大 , 则 【】中的函数值最小
 
注意到 【】中的值由  X 确定 ,而 前面我们已经确定了 X 的区间,
 
容易看出 【】中的函数是个单峰函数:
 
 
根据 a^2 + b^2 >= 2ab 成立的条件是 a = b
所以我们可以确定如果 X = (H-h)*D / X 求出的值就是上图中的 X0
 
那么要使得【】中的值最小,结果是显然的了。既然能确定极值点,那么也没有必要用三分了
 
分下面三种情况即可求出满足条件的 X 使得shadow 最大 :
 
(1) X 的取值范围覆盖了 X0: X = X0
(2) X 的取值范围所在的区间单调递减【right <= X0】: X = right
(3) X 的取值范围所在的区间单调递增【left >= X0】: X = left
 
把所求的 X 带入上面的shadow 公式就是答案了。
 
想到根据函数的极值求主要是想的是三分图中的 X 本来就比较复杂了,虽然弄到这一步三分和求极值都一样。
但是如果真的用三分的思路的话, 还是觉得荆红浅醉 童鞋的三分 L 比较好,
虽然无法轻易的求出极值点,但是至少可以一眼看出 L 的取值范围是【0, H】话说要是所有的三分都能求出极值点,那么也 就失去了三分的意义了。
 

学妹的思路:三分 L

 
令所求 shadow =  S + L
PS : S 就是上图的 D - X
 
由 L / H = ? / (D+?)      可以得到  ?= (L*D)  /  (H-L)
 
而 L / h = ? / (S+ ?)      可得 S = ?* (h-L) / L   =  D*(h-L) / (H-L)   前面又已经确定了 L 的范围【0, H】
 
shadow = S + L 随便乱搞都可以三分出来了。

 #include<stdio.h>
#include<string.h>
#include<math.h> int main()
{
int T;
double H,h,D;
scanf("%d", &T);
while(T--)
{
scanf("%lf%lf%lf", &H,&h,&D);
double x1 = (H-h)*D/H;
double x2 = D;
double x0 = sqrt(D*(H-h)); double x; if(x1 <= x0 && x0 <= x2) x = x0;
else if(x0 <= x1) x = x1;
else if(x0 >= x2) x = x2; double ans = D+H- (x + (H-h)*D/x);
printf("%.3lf\n", ans);
}
return ;
}

A. Light Bulb的更多相关文章

  1. 三分 --- ZOJ 3203 Light Bulb

    Light Bulb Problem's Link:   http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3203 Mean: ...

  2. Light Bulb(三分)

    ZOJ Problem Set - 3203 Light Bulb Time Limit: 1 Second      Memory Limit: 32768 KB Compared to wildl ...

  3. ZOJ 3203 Light Bulb - 求导求最大值

    如果L全在地面上: 输出 h * D / H 如果L全在墙上: 输出 h 否则: (D - X ) / X = Y / (H - h) L = D - X + h - Y 然后对L求导即可 #incl ...

  4. zoj 3203 Light Bulb,三分之二的基本问题

    Light Bulb Time Limit: 1 Second      Memory Limit: 32768 KB Compared to wildleopard's wealthiness, h ...

  5. ZOJ 3203 Light Bulb (三分+计算几何)

    B - Light Bulb Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit ...

  6. ZOJ 3203 Light Bulb (三分查找)

    Light Bulb Time Limit: 1 Second      Memory Limit: 32768 KB Compared to wildleopard's wealthiness, h ...

  7. ZOJ 3203 Light Bulb

    Compared to wildleopard's wealthiness, his brother mildleopard is rather poor. His house is narrow a ...

  8. ZOJ 3203 Light Bulb(数学对勾函数)

    Light Bulb Time Limit: 1 Second      Memory Limit: 32768 KB Compared to wildleopard's wealthiness, h ...

  9. TOJ 2814 Light Bulb

    Description Compared to wildleopard's wealthiness, his brother mildleopard is rather poor. His house ...

随机推荐

  1. Linux-软件安装(一) —— jdk/tomact 安装(普通安装)

    Linux-软件安装(一) -- jdk/tomact 安装(普通安装) 1. 可使用 FinalShell 上传至 Linux 服务器 2. 解压 cd /usr/local #解压命令 tar - ...

  2. Spring Cloud Config git版

    由于在学习这块内容的时候还不会使用gitHub所以就用了osc的码云 config server POM文件 <dependency> <groupId>org.springf ...

  3. HDU4576 Robot(概率)

    题意 抄袭自https://www.cnblogs.com/Paul-Guderian/p/7624039.html  多组输入n,m,l,r.表示在一个环上有n个格子.接下来输入m个w表示连续的一段 ...

  4. IOS typedef 函数指针的用法

    代码简化, 促进跨平台开发的目的. typedef 行为有点像 #define 宏,用其实际类型替代同义字. 不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换. 用 ...

  5. IOS自动化测试之UIAutomation

    通过Xcode工具编写运行测试脚本 1.当你有了一个应用的源代码之后,在Xcode工具中,首先选中被测应用,然后点击菜单栏中的“Product-Profile”,则会弹出Instruments工具,在 ...

  6. Win10系统64位快速专业安装版 V2016年

    win10系统64位快速专业安装版 V2016年2月 系统下载:http://www.xitongma.com/ Ghost Win10 64位正式装机专业版2016 微软向Windows用户推送了w ...

  7. NBUT 1119 Patchouli's Books (STL应用)

    题意: 输入一个序列,每个数字小于16,序列元素个数小于9. 要求将这个序列所有可能出现的顺序输出,而且要字典序. 思路: 先排序,输出该升序序列,再用next_permutation进行转变即可,它 ...

  8. hdu 3555 Bomb 炸弹(数位DP,入门)

    题意: 给一个数字n,求从1~n中有多少个数是含有49的,比如49,149,1490等都是含49的. 思路: 2^64也顶多是十进制的20多位,那么按十进制位来分析更简单.如果能计算k位十进制数中分别 ...

  9. 使用JDK自带的jmap和jhat监控处于运行状态的Java进程

    对于处于运行状态中的Java进程,JDK自带了很多工具,允许Java开发人员监控运行进程中的各种状态,比如该进程内部创建了多少个对象实例,消耗了多少内存,等等. 本文基于JDK1.8而写成. 我下面写 ...

  10. java中的堆与栈

    Java 中的堆和栈 Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配 . 当在一段代码块定义一个变量时,Java就在栈中 ...