WQS二分/带权二分/凸包优化
WQS二分/带权二分/凸包优化
应用范围
- 限制个数:给定一些物品和选物品的限制条件,要求刚好选 \(m\) 个,让你最大化(最小化)权值。
- 单调性:选的物品越多,权值越大(越小)。
分析
1.原理解释:
假设限制不固定,当选 \(x\) 个时,最大权值为 \(f(x)\)。算法的核心就是将“选取物品”这一操作赋予权值,即每选择一个物品,我们将总权值加 \(C\)。这个 \(C\) 就是我们二分的东西。设经过我们“赋予权值操作后”,式子的值变成了 \(b\).可以得到 \(b=f(x)+C \times x\)。
若我们二分,选定一个 \(C\) 的值,在 不考虑选 \(m\) 个物品的情况下 进行 \(dp\)。此时我们不仅要记录最小权值,还要记录这个权值对应的,选的物品个数。根据上文,我们便得到了 \(b\) 和 \(x\).又已知 \(C\),就可以算出\(f(x)\).
当然,现在的 \(x\) 不一定就是题目要求的 \(m\),但由于问题具有单调性(见上),当 \(C\) 更小时,选择的物品会变少,\(x\)越大,当 \(C\) 更大时,选择的物品会变多,\(x\) 越大。根据 \(x\) 和 \(m\) 的大小关系,不断调整 \(C\)的值,直到 \(x=m\).这时再根据 \(b\),\(x\) 和 \(C\) 算出 \(f(x)\).
上面所描述的是一种理解的思路。下面我们把问题转化为“凸包问题”。
上文有这样一个式子:\(b=f(x)+C \times x\)。为了方便,现在把 \(b=f(x)+C \times x\) 变为 \(b=f(x)-C \times x\).(实际上只是把提前 \(C\) 变为 \(-C\),没有本质区别)。
发现这个式子形如 \(b=y-k \times x\). 把 \((x,f(x))\) 设为一个点。这些点的集合为凸包(不会证qwq,感觉只能用上一种思路证明单调性)。\(C\) 表示斜率。就相当于用一条斜率为\(k\)的直线切这个凸包。切线的截距显然是最小的(上一种理解思路就重合了)。切到的这个点为 \((x,f(x))\).不断调整 \(C\) 的过程就相当于在不断调整切线的斜率,使切线刚好切到\(m\).
细节处理
有时候,会发现当 \(C=p-1\) 时,\(x=m-1\),而 \(C=p\) 时,\(x=m+1\)。我们可以将 \(C\) 二分到小数,但是这样可能为\(T\).实际上,不需要小数也是正确的。参见Creeper_LKF的博客.
题目链接
本文来自博客园,作者:bwartist,转载请注明原文链接:https://www.cnblogs.com/bwartist/p/17556544.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!