三分查找的应用:
当需要求某凸性或凹形函数的极值,通过函数本身表达式并不容易求解时,就可以用三分法不断逼近求解。
三分 我还特地测试了几个临界判断条件的代码,这里和二分不同,(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];
这题的人影在地上部分的长度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);
}
}