90%「限制下求极值」题,二分答案可秒解(纯干货版)

张开发
2026/5/7 15:10:31 15 分钟阅读
90%「限制下求极值」题,二分答案可秒解(纯干货版)
一、核心定义什么是「限制下求极值」题型题干核心矛盾需在「硬性限制条件」下求解「最大化最小值」或「最小化最大值」是算法竞赛NOIP / 蓝桥等高频题型90% 可通过二分答案解决。核心共性目标是极值最大 / 最小结果需满足明确限制答案空间具有天然单调性。典型示例P1824 进击的奶牛最大化牛的最小间距限制放 m 头牛、P1182 数列分段最小化最大段和限制分 m 段。二、为什么这类题必用二分核心逻辑1. 二分的核心前提答案空间单调性设候选答案为 d满足「单调性三要素」可行性存在一个临界值 d0d≤d0 时满足限制dd0 时不满足最大化最小值反之则为最小化最大值。有序性答案空间呈「左可行、右不可行」或「左不可行、右可行」的线性有序分布。可验证性能在 O (n) 或 O (nlogn) 时间内判断 d 是否满足限制核心是 check 函数。2. 二分 vs 暴力效率碾压这类题答案范围通常为 1e9 级别暴力枚举时间复杂度 O (1e9×n)必超时二分仅需枚举 log₂(1e9)≈30 次总复杂度 O (30×n)可轻松通过 1e5 级数据。三、一眼识别二分答案的 3 个黄金特征必记题干明确要求「最大化最小值」或「最小化最大值」最直观信号答案空间具有单调性d 越小越易满足限制d 越大越难满足或反之存在高效验证函数能快速判断候选答案是否符合限制。四、二分答案万能模板C通杀所有同类题模板框架仅需修改 check 函数#include vectoralgorithm using namespace std; typedef long long ll; // 必用long long防溢出 // 核心验证函数根据题目修改逻辑 bool check(constll arr, ll mid, int limit) { // 示例进击的奶牛验证逻辑limit m放m头牛 int cnt 1; ll last arr[0]; for (int i 1; arr.size(); i) { if (arr[i] - last mid) { cnt; last arr[i]; if (cnt limit) return true; } } return cnt limit; } int main() { ios::sync_with_stdio(false); // 快速IO大数据必加 cin.tie(nullptr); int n, limit; // limit题目限制如m头牛、m段 cin n limit; ll arr(n); for (int i 0; i n; i) cin arr[i]; // 1. 预处理部分题需排序如奶牛、跳石头 sort(arr.begin(), arr.end()); // 2. 确定二分边界关键不能错 ll l 1; // 最小可能答案根据题目调整如切绳子可设为0 ll r arr.back() - arr[0]; // 最大可能答案根据题目调整 ll ans 0; // 3. 二分主循环固定写法 while (l r) { ll mid l (r - l) / 2; // 防溢出等价于(l r)/2 if (check(arr, mid, limit)) { // 最大化最小值可行则尝试更大值 ans mid; l mid 1; } else { // 不可行则缩小范围 r mid - 1; } } endl; return 0; }模板细节必注意最大化最小值check 通过时l mid 1记录 ans当前可行最大值最小化最大值check 通过时r mid - 1记录 ans当前可行最小值边界设置l 取最小可能答案如间距≥1切绳子≥0r 取最大可能答案如首尾间距、总和数据类型ans、mid、l、r 必须用 long long避免 1e9 级数据溢出。五、实战拆解P1824 进击的奶牛模板套用题目输入n5m3牛舍位置 [1,2,8,4,9]模板套用步骤预处理排序后 [1,2,4,8,9]边界l1r9-18二分循环mid4check (4)→仅放 2 头牛不可行→r3mid2check (2)→放 3 头牛可行→ans2l3mid3check (3)→放 3 头牛可行→ans3l4l4r3循环结束ans3。结果3正确与样例一致六、同类题模板适配仅改 check 函数1. P1182 数列分段最小化最大段和boolll arr, ll mid, int m) { ll sum 0; int cnt 1; for (ll x : arr) { if (sum x mid) { // 超过mid分段 cnt; sum x; if (cnt m) return false; } else { sum x; } } m; } // 主循环调整check通过时r mid - 1ansmid2. P2678 跳石头最大化最小间距ll arr, ll mid, int k) { int cnt 0; ll last arr[0]; for (int i 1 arr.size(); i) { if (arr[i] - mid) { // 间距不足移除石头 cnt; if (cnt k) return false; } else { last arr[i]; } } return k; } // 主循环同奶牛题最大化最小值七、新手避坑清单高频错误忘记排序奶牛、跳石头等题需排序后才能贪心验证不排序直接 WA数据溢出未用 long long导致 mid、ans 计算错误边界错误l 设为 0如间距题、r 设太小导致漏答案check 逻辑错误贪心不严谨如奶牛题不从第一个牛舍放牛未加快速 IO大数据输入超时混淆最大化 / 最小化边界调整逻辑导致答案错误。八、核心总结「限制下求极值」「最大化最小值 / 最小化最大值」90% 用二分答案核心是「二分猜答案 贪心验证」模板固定仅需修改 check 函数关键细节long long、边界设置、排序按需、快速 IO掌握后可通杀 NOIP 普及组、蓝桥杯所有同类题性价比极高。

更多文章