zoj Light Bulb

题意:给出H(灯高度),h(人高度),D(灯到对面墙的高度),求L的长度(影子的长度)

分析:影子可能只打到墙上,可能既打到墙上又打到地上,也可能只打到地上

当只打到地上,当头刚好打到墙和地面的接触点,显然影子最长,影子长度L=h/H*D

当只打到墙上,影子长度必然就是人高

地上和墙上都有影子的时候,分别延长光线和地面线的交于一点,夹角为Θ角,夹角

有限制,tanΘ>=H/D,分界点是人头打在地面和强的接触线,当人再向左移动,D必

必定满足不了输入的D,tanΘ<=(H-h)/D,此时人刚好贴着墙站,

设影子打到墙上的高度是x,延长的做出的三角则为x/tanΘ;

推断出公式-((H-h)/tanΘ+DtanΘ)+D+H,然后根据一般不等式a+b>=2√ab;

tanΘ=√(H-h)/D

#include<stdio.h>
#include<math.h>
int main()
{
  double H,h,D,t,l;
  int T;
  scanf("%d",&T);
  while(T--)
  {
	  scanf("%lf%lf%lf",&H,&h,&D);
	  l=h/H*D;
	  double k=sqrt((H-h)/D);
     if(k>H/D || k<(H-h)/D)
	 {
	   if(l>h)  printf("%.3f\n",l);
	   else  printf("%.3f\n",h);
	 }
	 else
	 {
          t=D+H-2*sqrt(D*(H-h));
		  if(t<l) 
		  {
		    double temp=t;
			 t=l;
			 l=temp;

		  }
		  if(t<h)
		  {
		     double temp=t;
			 t=h;
             h=temp;
		  }
		  printf("%.3f\n",t);
	 }
  }
  return 0;
}


 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值