[清华集训2015]灯泡(浙江大学ZOJ 3203 Light Bulb)
Time Limit: 1 Second Memory Limit: 32768 KB
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 H, h 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
题目大意:
他的房子狭窄,他家里只有一个灯泡。每天晚上,他都在他不知名的房子里徘徊,想着如何赚更多的钱。有一天,他发现他的影子长度在灯泡和房子的墙壁之间行走时不时变化。突然想到了他的思绪,他想知道他的影子的最大长度。
输入的第一行包含整数T(T <= 100),表示个案数。
每个测试用例在一行中 包含三个实数H,h和D. H是灯泡的高度,而h是轻度高度的高度。 D是灯泡和墙壁之间的距离。所有数字的范围均为10 -2至10 3,包括两者,H - h > = 10 -2。
对于每个测试用例,在一行中输出mildleopard阴影的最大长度,精确到三位小数。
算法分析
参考:
https://blog.csdn.net/Mrx_Nh/article/details/52745348 分析理解应该是对的,但是代码有误,估计是没有讨论影子不落到墙上的情况。
https://blog.csdn.net/qq_38944163/article/details/80870928 代码是正确的。
这个题要分两种情况讨论:影子没有落到墙上;影子落到墙上。
影子没有落到墙上的情况如下图所示:

影子落到墙上的情况如下图所示

算影子的长度可以用相似三角形,相信各位上过初中的朋友都会。。
那么我们发现这是一个单峰函数,要求峰值,这里我们可以用一个很强大的东西,三分法。
具体看代码吧
#include<stdio.h>
double f(double x,double H,double h,double D)
{
double tanA,Y;
tanA=(H-h)/x;//这里大家可以画个图帮助理解
Y=H/tanA;//下面那条的长(在没有墙的情况下)
if(Y<=D) return Y-x;//如果没到墙,就直接返回地上影子的长度。
Y=Y-D;
return D-x+Y*tanA;//D-X是地上影子的长度,Y*tanA是墙上影子的长度.
}
int main()
{
freopen("p3382.in","r",stdin);
int i,T;
double H,h,D;
double L,R,m1,m2,fm1,fm2;
scanf("%d",&T);
for(i=;i<T;i++)
{
scanf("%lf%lf%lf",&H,&h,&D);
L=;R=D;
while(L+1e-<R)
{
m1=L+(R-L)/; m2=R-(R-L)/;
fm1=f(m1,H,h,D); fm2=f(m2,H,h,D);
if(fm1<fm2) L=m1;
else R=m2;
}
printf("%.3lf\n",f(L,H,h,D));
}
return ;
}
为何是一个单峰,可以考虑看一下第一个参考的博客。

理解时参考下图:

[清华集训2015]灯泡(浙江大学ZOJ 3203 Light Bulb)的更多相关文章
- ZOJ 3203 Light Bulb (三分+计算几何)
B - Light Bulb Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit ...
- 三分 --- ZOJ 3203 Light Bulb
Light Bulb Problem's Link: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3203 Mean: ...
- ZOJ 3203 Light Bulb - 求导求最大值
如果L全在地面上: 输出 h * D / H 如果L全在墙上: 输出 h 否则: (D - X ) / X = Y / (H - h) L = D - X + h - Y 然后对L求导即可 #incl ...
- zoj 3203 Light Bulb,三分之二的基本问题
Light Bulb Time Limit: 1 Second Memory Limit: 32768 KB Compared to wildleopard's wealthiness, h ...
- ZOJ 3203 Light Bulb (三分查找)
Light Bulb Time Limit: 1 Second Memory Limit: 32768 KB Compared to wildleopard's wealthiness, h ...
- ZOJ 3203 Light Bulb
Compared to wildleopard's wealthiness, his brother mildleopard is rather poor. His house is narrow a ...
- ZOJ 3203 Light Bulb(数学对勾函数)
Light Bulb Time Limit: 1 Second Memory Limit: 32768 KB Compared to wildleopard's wealthiness, h ...
- ZOJ 3203 Light Bulb( 三分求极值 )
链接:传送门 题意: 求影子长度 L 的最大值 思路:如果 x = 0 ,即影子到达右下角时,如果人继续向后走,那么影子一定是缩短的,所以不考虑这种情况.根据图中的辅助线外加相似三角形定理可以得到 L ...
- ZOJ - 3203 Light Bulb(三分)
题意:灯离地面的高度为$H$,人的身高为$h$,灯离墙的距离为$D$,人站在不同位置,影子的长度不一样,求出影子的最长长度. 思路:设人离灯的距离为$x$,当人走到距离灯长度为$L$时,人在墙上的影子 ...
随机推荐
- CTFd平台搭建以及一些相关问题解决
CTFd平台搭建以及一些相关问题解决 一.序言 因为想给学校工作室提高一下学习氛围,随便带学弟学妹入门,所以做了一个ctf平台,开源的平台有CTFd和FBCTF,因为学生租不起高端云主机所以只能选择占 ...
- Linux操作系统内核参数
Linux操作系统内核参数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一./proc目录 /proc目录: 内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系 ...
- Statefulset:部署有状态的多副本应用
10.1.什么是Statefulset StatefulSet是Kubernetes提供的管理有状态应用的负载管理控制器API. 特点: 1.具有固定的网络标记(主机名) 2.具有持久化 ...
- excel打开提示 文件格式和扩展名不匹配。文件可能已损坏或不安全。除非您信任其来源,否则请勿打开。是否仍要打开它?
有的时候打开xls文档时,会提示“文件格式和扩展名不匹配.文件可能已损坏或不安全.除非您信任其来源,否则请勿打开.是否仍要打开它?” 遇到这种情况,我们需要 打开“注册表编辑器” win键+R键,打开 ...
- pid 控制
static std::map<pid_t, TTask *> Tasks; TError TTask::Fork(bool detach) { PORTO_ASSERT(!PostFor ...
- Spring Boot 2实现分布式锁——这才是实现分布式锁的正确姿势!
参考资料 网址 Spring Boot 2实现分布式锁--这才是实现分布式锁的正确姿势! http://www.spring4all.com/article/6892
- python基础语法5 函数定义,可变长参数
函数 1.什么是函数 函数就是一种工具. 可以重复调用 2.为什么要用函数 1.防止代码冗(rong)余 2.代码的可读性差 3.怎么用函数 1.定义函数-->制造工具 2.调用函数--> ...
- Can总线上的电平及物理层仲裁
CAN总线采用差分信号传输,通常情况下只需要两根信号线(CAN-H和CAN-L)就可以进行正常的通信.在干扰比较强的场合,还需要用到屏蔽地即CAN-G(主要功能是屏蔽干扰信号),CAN协议推荐用户使用 ...
- Docker部署ngnix静态网站
Hello World 首先获取ngnix镜像(默认的是最新版. docker pull nginx 先来编写一个最简单的Dockerfile,一个Dockerfile修改该Nginx镜像的首页 Do ...
- java 解决nginx代理的跨域访问问题
一.什么是跨域 跨域是浏览器对JavaScript同源策略的限制 二.什么情况下会产生跨域 域名不同 wwww.baidu.com www.jd.com 域名相同,访问的端口不同 wwww.baidu ...