【复习笔记】三分算法
考试考到了三分,但是我忘了\(qwq\)。
似乎没啥好说的,三分用于求单峰函数\(f(x)\)的最值。
存个板子,分别是整数和浮点数的。
如果忘了的话可以看一下 这个,写得还比较清楚。
在实际实现过程中,为了避免卡精度/死循环之类的惨案发生,可以适当将\(EPS\)设得大一点(指整数边界的差值,浮点数要看题目要求喏),在用三分得到了一个比较精确的区间之后,再枚举,并更新答案。或者也可以设定一个循环次数。
二分也是这样的(我记得之前的一些二分题就是这么干的,诶,记不太清楚了
二分答案的话,如果很明确区间左闭右闭/左闭右开/左开右开,或者哪个边界是合法但不优,哪个边界是答案足够小/大但不合法,就心里比较有底(感觉二分答案思路清晰一点)
►Code View
void dac_for_int()
{
int l/*=...*/,r/*=...*/,lans,rans;
while(l+2<r)
{
int lmid=l+(r-l)/3,rmid=r-(r-l)/3;
lans=f(lmid),rans=f(rmid);//函数f(x)
//---min
if(lans>rans) l=lmid;
else r=rmid;
//---
//---max
if(lans<rans) l=lmid;
else r=rmid;
//---
}
int ans=INF;
for(int i=l;i<=r;i++)
ans=min(ans,f(i));//这个具体看答案求啥
}
#define EPS 1e-9
void dac_for_double()
{
double l/*=...*/,r/*=...*/,lans,rans;
while(l+EPS<r)
{
double lmid=l+(r-l)/3.0,rmid=r-(r-l)/3.0;
lans=f(lmid),rans=f(rmid);
//---min
if(lans>rans) l=lmid;
else r=rmid;
//---
//---max
if(lans<rans) l=lmid;
else r=rmid;
//---
}
printf("%.9f\n",l);//这个看着办吧(看答案求啥)
}
转载请注明出处,有疑问欢迎探讨
博主邮箱 2775182058@qq.com