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

  1. 3
  2. 2 1 0.5
  3. 2 0.5 3
  4. 4 3 4

Sample Output

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

算法:利用函数的凸性

 
 

思路一:

 
 
 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 随便乱搞都可以三分出来了。
  1.  
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<math.h>
  4.  
  5. int main()
  6. {
  7. int T;
  8. double H,h,D;
  9. scanf("%d", &T);
  10. while(T--)
  11. {
  12. scanf("%lf%lf%lf", &H,&h,&D);
  13. double x1 = (H-h)*D/H;
  14. double x2 = D;
  15. double x0 = sqrt(D*(H-h));
  16.  
  17. double x;
  18.  
  19. if(x1 <= x0 && x0 <= x2) x = x0;
  20. else if(x0 <= x1) x = x1;
  21. else if(x0 >= x2) x = x2;
  22.  
  23. double ans = D+H- (x + (H-h)*D/x);
  24. printf("%.3lf\n", ans);
  25. }
  26. return ;
  27. }

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. jsp get与post请求乱码问题

    乱码问题01:<%reques.setCharacterEncoding("utf-8");%> 02:get请求乱码 001.:String 编码之后的字符串 = n ...

  2. vue cli 脚手架上多页面开发 支持webpack2.x

    A yuri demo for webpack2 vue multiple page.我看到有一些项目多页面项目是基于webapck1.0的,我这个是在webpack2.x上布置修改.  项目地址:  ...

  3. vue之导入Bootstrap和Jquery

    Vue引入bootstrap主要有两种方法 方法一:在main.js中引入,此方法导入的bootstrap中对于html,body的一些预设置的css样式可能无效. 一.引入jQuery 在当前项目的 ...

  4. ios UI自动化测试

    转载:http://www.cnblogs.com/dokaygang128/p/3517674.html 一.一些注意事项: 1.做自动化测试时注意如果是真机话首先要设置不锁屏. 2.自动化测试过程 ...

  5. vue.js学习总结

    下面使用的命令工具为git bash 使用命令行工具搭建vue.js项目 vue.js官网命令行工具安装 为了提升安装速度,建议将 npm 的注册表源设置为国内的镜像 1.输入命令:npm insta ...

  6. 如何使用Git Bash Here,将本地项目传到github上

    申请一个github账号 安装git bash git与git bash的区别: git:版本控制工具,支持该工具的网站有Github.BitBucket.Gitorious.国内的osChina仓库 ...

  7. java动态代理使用详解

    我们都知道AOP的原理就是java的动态代理机制,下面我就对java的动态代理机制进行学习与总结 java动态代理的实现有两个重要的类: Proxy:类 作用就是用来动态创建一个代理对象的类 Invo ...

  8. JAVA 数据库编程中的性能优化

    1. 禁止自动提交:在默认情况下,程序执行的任何sql 语句都是自动提交的向一个表中插入2000条记录,自动提交所用的时间  11666毫秒禁止自动提交(显示提交) 3450毫秒 2. 批处理:多用批 ...

  9. elasticsearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解

    一.快速入门1. 查看集群的健康状况http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状 ...

  10. Java poi 的使用

    poi可操作老旧版本的excel 下载jar包,http://archive.apache.org/dist/poi/release/bin/poi-bin-3.17-20170915.tar.gz ...