三分
影子L的变化分为两部分。第一部分:墙上影子为0,地面影子不断增长,变化的形式比较简单,当x取到第一部分的最大值(x=下文的l)时,就取到了第一部分L的最大值;第二部分,墙上影子不断增大,地面影子不断减小,与第一部分比起来变化稍微有点复杂,但仍可以确定是单峰上突函数,所以可以用三分来解决。下面就针对两部分进行分析
设左侧墙壁到该人的位置为x,第一部分的范围是(0<=x<=l),第二部分的范围是(l<=x<=D),题目的重点便就转化为了求出l和第二部分变化的函数解析式:
第一部分(求l):
直接看取到最大值的图像:
通过简单的相似三角形的计算得出:l=D-D*h/H
第二部分(求第二部分的函数解析式);
地面部分的影子很简单就是D-x,重点是墙面上的影子,我们这里设他为y
同样,做辅助线,利用相似三角形得到y=H+D(H-h)/x;
L=D-x+H+D(H-h)/x;
两部分都算好以后,就可以写个三分,A掉这题了!
1 #include<bits/stdc++.h> 2 using namespace std; 3 int T; 4 double H,h,D; 5 double f(double x){ 6 return D-x+H+D*(h-H)/x; 7 } 8 int main(){ 9 scanf("%d",&T); 10 for(int X=1;X<=T;X++){ 11 scanf("%lf%lf%lf",&H,&h,&D); 12 double l=D-D*h/H,r=D; 13 while(r-l>=1e-3){ 14 double m1=l+(r-l)/3,m2=r-(r-l)/3; 15 if(f(m1)<f(m2))l=m1; 16 else r=m2; 17 } 18 printf("%.3lf\n",f(r)); 19 } 20 return 0; 21 }