【复习笔记】三分算法
考试考到了三分,但是我忘了。
似乎没啥好说的,三分用于求单峰函数的最值。
存个板子,分别是整数和浮点数的。
如果忘了的话可以看一下 这个,写得还比较清楚。
在实际实现过程中,为了避免卡精度/死循环之类的惨案发生,可以适当将设得大一点(指整数边界的差值,浮点数要看题目要求喏),在用三分得到了一个比较精确的区间之后,再枚举,并更新答案。或者也可以设定一个循环次数。
二分也是这样的(我记得之前的一些二分题就是这么干的,诶,记不太清楚了
二分答案的话,如果很明确区间左闭右闭/左闭右开/左开右开,或者哪个边界是合法但不优,哪个边界是答案足够小/大但不合法,就心里比较有底(感觉二分答案思路清晰一点)
►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);//这个看着办吧(看答案求啥)
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现