ZOJ 3203 Light Bulb

三分

影子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 }

猜你喜欢

转载自www.cnblogs.com/Laehcim/p/10994292.html
ZOJ