跳到主要内容

贪心选择与证明

本节目标

从交换论证出发,判断一个局部选择能否安全地通向全局最优。

贪心不是“每次看起来最划算就选什么”。它必须先确定一个局部选择,再证明任意最优解都能被替换成同样的选择而不变差。这个替换过程就是交换论证;若替换后答案不变差,当前选择便是安全的。

识别信号

  • 所有候选项都可排序,且题目要求最小总等待、最小最大风险或最多匹配数量。
  • 调整两个相邻候选项的先后顺序,会直接影响目标函数。
  • 一旦先处理的候选固定,剩余部分仍是同类子问题。

问题模型与核心不变量

先写清候选选择、排序规则和交换对象。若最优排列中出现一个“逆序对”,交换这两个相邻项不会使目标更差,便可持续交换到满足排序规则的最优排列。处理前缀时的不变量是:已确定的前缀存在一个同样好的最优解与它一致。

通用模板

按可证明的关键字排序
维护已完成前缀的必要状态
依次尝试当前候选:
若它满足当前最小需求或能改善目标:接受它
否则丢弃或留给后续候选

排序本身不是证明;排序键必须来自交换两个相邻元素后的差值。

模板变体

  • 资源匹配中,用最小可行资源满足最小需求,避免大资源被小需求浪费。
  • 总等待时间中,交换两个服务时长为 ab 的顾客,较短者在前不会增加等待和。
  • 最大风险中,比较两头牛的顺序后可得到 w + s 的排序键;风险定义必须先固定为“上方总重量减当前强壮值”。

母题序列

  1. 分发饼干必学):先满足胃口最小的孩子,练习资源匹配的交换论证。
  2. 排队打水必学):由相邻交换推导短作业优先。
  3. 耍杂技的牛拓展):从最大风险的比较式推导 w + s 排序。

常见误区

  • 只说“排序后显然最优”,却没有比较交换前后的目标。
  • 将“当前最优”误当成“局部数值最大”;正确选择可能是最小可行资源。
  • 没有固定风险或代价的定义,导致排序规则和样例计算不一致。
  • 忽略中间和可能超出 int 的题目范围。

迁移方向

交换论证是区间按端点排序、最小代价合并和队列重建的共同基础。若无法构造安全交换,或选择会影响多个未来状态,则要警惕问题可能需要动态规划或搜索。