把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

【复习笔记】三分算法

考试考到了三分,但是我忘了\(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);//这个看着办吧(看答案求啥)
}
posted @ 2020-12-03 17:56  Starlight_Glimmer  阅读(131)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end