Light Bulb zoj 3203 三分

题意:本题要求找出折射阴影最大的人所占位置

   在最开始的时候,往右走会逐渐增大,直到阴影值恰好等于在折射到墙的零界点的时候,开始有可能有下降趋势

   接下来如果人继续往右走,就会折射在墙上,这个时候就得利用相似三角形的知识

   计算出折射在墙上的长度,然后再加上折射在地上的强度。

   因为这个过程呈现出先增大后减少的上凸形函数类型,所以可以用三分的方法来解决

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=20;
 4 double a[maxn];
 5 int n;
 6 double H,h,D;
 7 double check(double dis)
 8 {
 9     double tmp1=(h*dis)/(H-h);
10     if(tmp1+dis<=D) return tmp1;
11     else{
12         double a=tmp1-(D-dis);
13         double b=tmp1;
14         double tmp2=a*h/b;
15         double ans=tmp2+D-dis;
16         return ans;
17     }
18 }
19 int main()
20 {
21     int T;
22     scanf("%d",&T);
23     while(T--){
24         scanf("%lf%lf%lf",&H,&h,&D);
25         double L=D-h*D/H,R=D;
26         double ans;
27         while(R-L>=1e-7){
28             double mid1=(L+R)/2;
29             double mid2=(mid1+R)/2;
30             if(check(mid1)<check(mid2)){
31                 L=mid1;
32                 ans=check(mid2);
33             }
34             else{
35                 R=mid2;
36                 ans=check(mid1);
37             }
38         }
39         printf("%.5f\n",ans);
40     }
41     return 0;
42 }
View Code

 

posted @ 2020-09-22 22:39  古比  阅读(115)  评论(0编辑  收藏  举报