ZOJ3203--Light Bulb(三分法)

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

Author: GUAN, Yao

Source: The 6th Zhejiang Provincial Collegiate Programming Contest

Submit Status

三分法,在某一个位置,灯,人头顶和墙角三点一线,从这个点A开始走到墙角,影子长度先增后减,是一个凸函数,可以用三分法求解

显然 A = D?(H?h)H , 每次得到的影子长度为len = (D?x)+H? D?(H?h)x

然后三分求解即可,注意精度

/*************************************************************************
    > File Name: ZOJ3203.cpp
    > Author: ALex
    > Mail: [email protected]
    > Created Time: 2015年04月05日 星期日 15时23分34秒
 ************************************************************************/

#include <functional>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#include <set>
#include <vector>

using namespace std;

const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double eps = 1e-9;
typedef long long LL;
typedef pair <int, int> PLL;

double H, h, D;

double calc(double x)
{
    return H + D - x - D * (H - h) / x;
}

int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        scanf("%lf%lf%lf", &H, &h, &D);
        double l = D * (H - h) / H, r = D;
        double mid, midmid, midmidarea, midarea;
        while (l + eps <= r)
        {
            mid = (l + r) / 2;
            midmid = (mid + r) / 2;
            midarea = calc(mid);
            midmidarea = calc(midmid);
            if (midarea >= midmidarea)
            {
                r = midmid;
            }
            else
            {
                l = mid;
            }
        }
        printf("%.3f\n", calc(l));
    }
    return 0;
}
时间: 2024-08-28 05:46:58

ZOJ3203--Light Bulb(三分法)的相关文章

题解 ZOJ3203 Light Bulb

也就是loj上的#10016灯泡了... 先上原图: 因为长度肯定是个开口向下的二次函数,所以先是确定用三分来找位置,然后想办法求出当前阴影长度 看到这条斜线,就想到了一次函数,所以就建了一个系,没想到还真解出来了. 首先设灯泡位置为(H,0),再设它与人头之间连接的线段所在直线为y=kx+b 所以b=H(在灯泡处入x=0代可以解出来),k=(h-b)/x=(h-H)/x(这个不用解释吧) 所以这条直线(也就是光线)与地面相交于y=0时 即x1=-b/k. 因为b,k已知,所以肯定求得出来 然后

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

ZOJ Problem Set - 3203 Light Bulb 【三分法】

题目:ZOJ Problem Set - 3203 Light Bulb 题意: 如图,有个人在地上走,然后他的影子可以投影到墙上或者地上,问影子最长是多少? 分析: 我们知道,三分法是解决一个凹或凸函数的极大极小值,发现这个影子从刚好投影到右下角开始便是一个凸函数,他的影子长度是先递增后递减的,所以可以用三分法. 三分法的原理: AC代码: #include <cstdio> #include <cstring> #include <vector> #include

Light Bulb--zoj3203(三分法)

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

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, t

[清华集训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, t

ZOJ 3203: Light Bulb

ZOJ 3203: Light Bulb 1 ///@author Sycamore, ZJNU 2 ///@date 2017-02-09 3 #include<algorithm> 4 #include<iostream> 5 #include<iomanip> 6 #define eps 1e-10 7 using namespace std; 8 double H, h, L, D; 9 double getL(double a) 10 { 11 return

Light Bulb(三分)

ZOJ Problem Set - 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 wand

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

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> #