最近刚学了二分法,还没有学三分,所以在上课之前,把三分总体的预习了一下,感觉三分应该和二分大体的思路还是一致的,二分的思路是在一个单调的数列基础上,每次都求中间值,然后不断缩小,最后求出解,这样可以把时间压缩到最小化。然而三分主要运用的方面是针对于数列是凹函数或者凸函数,先将一个区间分成3份,每份占1/3,比较mid1和mid2谁更加接近极值,我们假设mid1更加靠近极值,那么右区间就等于mid2,反之左区间等于mid1
代码模板:
#define eps 10e-6
double cal() {} //计算题目所需要的值
while(l+eps<r)
{
m1=l+(r-l)/3;
m2=r-(r-l)/3;
v1=cal(m1);
v2=cal(m2);
if(v1<v2)l=m1;
else r=m2;
}
另外的一种比较好理解的写法:
double Calc(Type a)
{
/* 根据题目的意思计算 */
}
void Solve(void)
{
double Left, Right;
double mid, midmid;
double mid_value, midmid_value;
Left = MIN; Right = MAX;
while (Left + EPS < Right)
{
mid = (Left + Right) / 2;
midmid = (mid + Right) / 2;
mid_area = Calc(mid);
midmid_area = Calc(midmid);
if (mid_area >= midmid_area) Right = midmid;
else Left = mid;
}
}