ZJNU——1262电灯泡(三分题)

Description

小明的房间布置十分简单,只有一个节能灯泡,非常的明亮。每天晚上,他总是在自己的房间里来回踱步,想着如何能赚到更多的钱。有一天,他发现他在房间里的影子长度也随着他的步伐不断变化。突然,他脑中闪过一个念头,影子的最大长度(包括地面和墙壁上的阴影)是多少呢?

Input

多组测试数据。

第一行一个整数T(T<=10)表示测试数据个数。

每组三个浮点数,H,h和D,分别如图所示。

(10^-2<所有数值<10^3,H-h>=10^-2)

分别用一个空格分开。

Output

输出为最长影子的长度。

Sample Input


3
2 1 0.5
2 0.5 3
4 3 4

Sample Output

1.000
0.750
4.000

以前做这道题的时候,写出了式子,但是一直都算不出来。现在才知道这是要用三分法做的。

因为这个函数不是单增或单减的;

做法:

首先,先根据三角形相似写出式子,然后再(0,h)中进行查找。

#include<stdio.h>
#include<iostream>
using namespace std;

double H,h,D,L;
double equ(double x){
	return x+(D*h-D*x)/(H-x);
}
double fd(double l,double r){
	//double l=0,r=1000.0;
	double mid=0,mmid=0;
	while(r-l>1e-10){
		mid=(l+r)/2.0;
		mmid=(mid+r)/2.0;
		if(equ(mid)>equ(mmid))
			r=mmid;
		else l=mid;
	}
	return equ(mid)>equ(mmid)? equ(mid):equ(mmid);
}
int main(){
	int T;
	double ans,t,p;
	cin>>T;
	while(T--){
		cin>>H>>h>>D;
		//L=D*h/H;
		//因为我这里使用的是以竖面上的投影为x,所以x的最大值是h,所以要从0~h进行判断才行;
		ans=fd(0,h);
		printf("%.3lf\n",ans);
	}
}

我一开始不知道三分的left点和right点,我还以为只要从0到最大值就好了;但是这样是不对的,因为如果每个点都在这个范围内的话,那么最大值肯定不会再那个范围内;

比如说x就会超过它的最大值h;

所以三分的范围就是(0,h);

最后三分之后,返回的值是两者中的最大值,因为它要求的是最长影子长度。

时间: 2024-10-13 04:43:58

ZJNU——1262电灯泡(三分题)的相关文章

ZJNU 1262 - 电灯泡——中高级

在影子没有到达墙角前,人越远离电灯,影子越长,所以这一部分无需考虑 所以只需要考虑墙上影子和地上影子同时存在的情况 因为在某一状态存在着最值 所以如果以影子总长与人的位置绘制y-x图像 会呈一个类似y=-x^2函数的图像 所以就可以根据三分法找出最值点 1 /* 2 Written By StelaYuri 3 */ 4 #include<stdio.h> 5 double H,h,D; 6 double len(double lh){ 7 return lh+D*(h-lh)/(H-lh);

三分题两道:lightoj1146 Closest Distance、lightoj1240 Point Segment Distance (3D)

lightoj1146 Two men are moving concurrently, one man is moving from A to B and other man is moving from C to D. Initially the first man is at A, and the second man is at C. They maintain constant velocities such that when the first man reaches B, at

ZOJ 3203 Light Bulb 三分

最简单的三分题,期末考完先做一道练练手 就是这么一个图,告诉你H h D,问你L最长是多少,假设人到灯的距离是X,那么容易得到 L = H-D/x*(H-h)+D-x,求个导很容易发现是一个关于x 的凸性函数,就可以三分啦 要注意的是三分的时候的精度eps,这题要求得是1e-9才能A,1e-8都WA,真是囧 #include <cstdio> #include <sstream> #include <fstream> #include <cstring> #

POJ 3737

第一道三分题,有模板 #define eps 10e-6 double cal(){}//计算题目所需要的值 while(l+eps<r) { m1=l+(r-l)/3; m2=r-(r-l)/3; v1=cal(m1); v2=cal(m2); if(v1<v2)l=m1; else r=m2; } 感觉三分像是数学题,因为它求的是单峰极值的问题. #include <iostream> #include <cmath> #include <cstdio>

20135329李海空 家庭作业

第二章: 两分题: 20135327 郭皓 :3 20135329 李海空:1 2.67 给你一个任务,编写一个过程int_size_is_32(),当在一个int是32位的机器上运行时,该程序产生1,而其他情况则产生0.不允许使用sizeof运算符.下面是开始时的尝试: /*The following code does not run properly on some machies*/ int bad_int_size_is_32(){ int set_msb = 1<<31; int

20135327郭皓 20135329李海空家庭作业汇总

第二章: 两分题: 20135327 郭皓 :3 20135329 李海空:1 2.67 给你一个任务,编写一个过程int_size_is_32(),当在一个int是32位的机器上运行时,该程序产生1,而其他情况则产生0.不允许使用sizeof运算符.下面是开始时的尝试: /*The following code does not run properly on some machies*/ int bad_int_size_is_32(){ int set_msb = 1<<31; int

Weakness and Poorness CodeForces - 578C

You are given a sequence of n integers a1,?a2,?...,?an. Determine a real number x such that the weakness of the sequence a1?-?x,?a2?-?x,?...,?an?-?x is as small as possible. The weakness of a sequence is defined as the maximum value of the poorness o

P2571 [SCOI2010]传送带

题意:在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段. 两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P, 在CD上的移动速度为Q,在平面上的移动速度R.现在lxhgww想从A点走到D点, 他想知道最少需要走多长时间 这貌似是物理题 第一道三分题,还是三分套三分(厉害了~~) 对AB,CD分别三分,求距离更新答案 因为判不了大小关系,取cnt=50来多次三分(足够了) #include<cstdio> #include<iostream> #in

zoj 3203 Light Bulb,三分基础题

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 incommodio