雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

三分查找——ZOJ3203

Posted on 2012-01-08 20:26  huhuuu  阅读(237)  评论(0编辑  收藏  举报

随着人的移动,求影子长短的变化,求最长

先写凸函数,注意是分段函数

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));
}
}