三分之ZOJ3203

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3366


题意:

在灯、人头、墙角成一条直线时,人从灯下走到墙的高度等于自己的身高的过程中,影子长度的最大值。


分析:

影子长为a,在人到达墙角时影子长为b,我们可以写出人在这两点间时影子的方程:(x*H-D*h)/(x-D)+x,

可知这个方程在【[a,b]之间是凸的,即先增加后减小,有极值,可以用三分法高效求解。

//题目:HDU 3714
//时间:2015-4-13 13:45
//作者:Miki
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;

const double eps=1e-9;
double H,h,D;

double Calc(double x)
{
    return (x*H-D*h)/(x-D)+x;
}
double Solve()
{
	//三分
    double Left = 0, Right = D * h / H;
    double mid, midmid;
    double mid_value, midmid_value;
    while (Left + eps < Right)
    {
        mid = (Left + Right) / 2.0;
        midmid = (mid + Right) / 2.0;
        mid_value = Calc(mid);
        midmid_value = Calc(midmid);

        // 求解最大极值
        if (mid_value >= midmid_value) 
			Right= midmid;
        else 
			Left = mid;
    }
	return midmid_value;
}
int main() 
{
	// freopen("in.txt","r",stdin);
    int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%lf %lf %lf",&H,&h,&D);
		printf("%.3lf\n",Solve());
	}
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值