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 }