TOJ 2814


题目连接:

http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2814


题目类型:

数论 - 计算几何


数据结构:


思路分析:


要求的L的最大值

首先需要建立关于L的方程式



1. 判定当影子全部在地面上的情况,

也就是 x + L <= D

L = h * x / ( H - h )

可知 L 为单调递增函数

所以 x 的值需要尽可能的大

最大达到 x + L = D

也就是 x = ( D * H - h * D ) / H  的时候

这时候 L = h * D / H;



2. 投影出现在墙上的情况

设地和影子虚像的总长为 K

那么 地上未呈现的影子长度为 K - D

地上已呈现的影子长度为 D - x


所以 L 的总长为 地上这部分加上墙上这部分

得 L = ( D - x ) + ( ( H - h ) * ( K - D ) ) / x

    K = H * x / ( H - h )


联立方程 得

L = ( -1 * x * x + ( H + D ) * x + ( h * D - D * H ) ) / x

要求L的最大值 必须点求的 x 的极值点

对L求导

得 L' = -1 + ( -1 ) *  ( h * D - D * H ) / ( x * x ) = 0

     1 = D * ( H - h ) / ( x * x )

     x = sqrt( D * ( H - h ) ) 

所以 x 等于 sqrt( D * ( H - h ) )  时  ( D -  h * D / H <= x <= D )

L取得最大值


比较两种情况的最大值

能得出 最后的答案


证明:


源代码:

#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int main()
{
	int t;
	double H, h, D;
	
	scanf( "%d", &t );
	
	while( t -- )
	{
		scanf( "%lf%lf%lf", &H, &h, &D );
		
		double x = D >= sqrt( D * ( H - h ) ) ? sqrt( D * ( H - h ) ) : D;
		
		if( x < ( D - h * D / H ) )
		{
			x = D - h * D / H;
		}
		
		printf( "%.3lf\n", max( h * D / H, ( - x * x + ( H + D ) * x + D * ( h - H ) ) / x ) );
	}
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值