一开始我都不知道怎么求,后来有人给我讲了一遍,我才有了大概的思路,但是后来求出的数字总是不对,我对照别人的答案才发现我没有理解三分查找的思想。
哎 ,总结的说 :这个题是水题,但是我花去的大量的时间。实在是可惜啊。
解题思路 :首先就是要推倒思路,思路有两种
我设投射在墙上的影子长度为x
投射在地上的影子为y
第一种是推导出 用墙上的x表示出y的数值,最后直接求出y的最大值和最小值就可以了。
第二种是推导出 用地上的y表示出x的数值,最后直接求出x的最大值和最小值就可以了。
这两种方法推倒都非常简单,初中数学就够用,不过我好想推到了好几遍,发现总是结果不对,后来才发现,推倒正确了,只是我三分查找写错了。
以后还是认真学习算法吧。。。。。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define EPS 1e-9
double H,h,D;
inline double Calc(double x){
return (h-x)*D/(H-x)+x;
}
void Sovel(){
double Left,Right,Mid,MidMid;
Left = 0;
Right = h;
while(Left + EPS < Right){
Mid = (Left+Right)/2;
MidMid = (Mid+Right)/2;
if(Calc(Mid) >= Calc(MidMid)) Right = MidMid;
else Left = Mid;
// printf("Left = %lf\n",Left);
// printf("Right = %lf\n",Right);
}
printf("%0.03lf\n",Calc(Left));
}
int main( void ){
int num;
scanf("%d",&num);
while(num--){
scanf("%lf%lf%lf",&H,&h,&D);
Sovel();
}
return 0;
}