随着人的移动,求影子长短的变化,求最长
先写凸函数,注意是分段函数
double temp=h*1.0/H*d;
double y;
if(x<temp)
y=(x*H-h*d)/(-d+x)+x;
else
y=(d-x)*h*1.0/H;
三分模板一套就0了
View Code
#include<stdio.h>
double ll,rr,mid,midmid,H,h,d;
double fun(double x)
{
double temp=h*1.0/H*d;
double y;
if(x<temp)
y=(x*H-h*d)/(-d+x)+x;
else
y=(d-x)*h*1.0/H;
return y;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%lf%lf%lf",&H,&h,&d);
ll=0;
rr=d;
while(ll+0.000001<rr)
{
mid=(ll+rr)/2.0;
midmid=(mid+rr)/2.0;
if(fun(mid)>=fun(midmid))
{
rr=midmid;
}
else
ll=mid;
}
printf("%.3lf\n",fun(ll));
}
}