三分查找入门题
算是二分查找的推广,但要求函数是在查找范围内是凸的或凹的.
#include <stdio.h>
#define esp 1e-6
double H,h,D;
double func(double rnum)
{
double ll=rnum*H/(H-h);
if(ll<=D) return ll-rnum;
else return D+H-rnum-(H-h)/rnum*D;
}
int main(int argc, char const *argv[])
{
int T;
double r,l,trid,trid2;
scanf("%d",&T);
while(T--)
{
scanf("%lf %lf %lf",&H,&h,&D);
l=esp;r=D;
while(r-l>esp)
{
trid=l+(r-l)/3.0;
trid2=l+2*(r-l)/3.0;//也可以是其他的不等分三分;
if(func(trid)>func(trid2)) r=trid2;
else l=trid;
}
printf("%.3lf\n",func(r) );
}
return 0;
}