Zoj 3203 Light Bulb (三分查找)

三分查找的应用:
当需要求某凸性或凹形函数的极值,通过函数本身表达式并不容易求解时,就可以用三分法不断逼近求解。

三分 我还特地测试了几个临界判断条件的代码,这里和二分不同,(left《right-1),等循环结束后要剩下,left,right,再比较这两个谁是极值。

  while(left<right-1)//减一为了得到最后left,right两个值,比较他们中最值。
    {
        int mid,midmid,max;
        mid=(left+right)/2;
        midmid=(mid+right)/2;
        if(a[mid]>a[midmid])
            right=midmid;
        else
            left=mid;
    }
       if(a[left]>a[right])
          max=a[left];
       else
          max=a[right];

Zoj 3203 Light Bulb (三分查找)_第1张图片
这题的人影在地上部分的长度x和总长l+x构成一个二次函数,用三分法求极值。

#include<cstdio>
#include<cmath>
#include<algorithm>
double h,D,H;
double cal(double x)
{
    return (h*D-H*x)/(D-x)+x;//我设的是,人的影子在地上长度那截为x。
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lf%lf%lf",&H,&h,&D);
        double mid,midmid,left=0,right=h/H*D;//所以当人影子没有在墙上的部分时,这里是一个临界点,以后求得影子全长是固定的,就是x,所以right到这里就够了。
        for(;left+1e-10<right;)
        {
            mid=(left+right)/2;
            midmid=(mid+right)/2;
            if(cal(mid)>cal(midmid))
                right=midmid;
            else
                left=mid;
        }
        double ans;
        if(cal(left)>cal(right))
            ans=cal(left);
        else
            ans=cal(right);
        printf("%.3lf\n",ans);
    }
}

你可能感兴趣的:(Zoj 3203 Light Bulb (三分查找))