贪!!心!!

贪||你妈的||心!!

贪心是一个依靠思考加猜想得到的算法,一般贪心的复杂度都很低,区分度很大,贪心的难度在于怎样及其证明。

除了练题我不知道有什么方法可以增强贪心能力。

1. 练习题

I P5521 [yLOI2019] 梅深不见冬

fx 表示想在 x 节点放梅花所需最少梅花数量。

对于节点 x 的子节点 y需要 y 节点放满梅花,我们可以回收 y 子树内所需的其他梅花,即 fywy,我们贪心的回收尽可能多的梅花,所以我们可以对 x 的子节点按照 fywy 排序,依次枚举,最后再考虑放满 x 节点即可。

  • 证明:假设有两对数 (f1,w1),(f2,w2),且 f1w1f2w2f1+w2f2+w1

    • 若按照 1,2 的顺序,则总花费为 f1+max(0,f2(f1w1))=max(f1,f2+w1)
    • 若按照 2,1 的顺序,则总花费为 f2+max(0,f1(f2w2))=max(f2,f1+w2)=f1+w2

    则由 f1+w2f1,得 f1+w2max(f1,f2+w1),即得按照 1,2 顺序更优。

    则以 fxwx 排序最优。

    得证。

复杂度 O(nlogn),瓶颈在排序。

代码

II CF798D Mike and distribution

一道贪心构造。

我们需要选 n2+1 个点,相当于每两个点我们需要选较大的那个点,我们先按照 a 排序,考虑 n 为奇数,则我们可以先选 a 最大的点,然后依次枚举两个点,找到 b 更大的选。

  • 这样对于 a,由于我们先选了最大的点,所以无论后面枚举的两个点选哪个,都可以使总数 Sa2,因为对于每一个我们选择的点 x,总可以 匹配 另一个未被选择的点 y,使 ayax
  • 对于 b,由于我们选了两个点中 b 更大的点,所以总数不会小于一半。

最后因为多选了一个点,所以总数一定大于一半。

对于 n 为偶数,随便多选一个即可。

代码

III P4053 [JSOI2007] 建筑抢修

我们贪心的选择点使得当前时间尽可能早,我们按照 T2 排序,枚举选择能加的就加,若不能加,则判断是否可以替换掉选择的点,使得当前时间更早,这样一定不劣,可以简单用优先队列维护。

不是很会怎么用数学证明。

复杂度 O(nlogn)

代码

IV P2107 小Z的AK计划

一道奇怪的贪心?假算法差点A了

显然先按照位置 x 排序,然后我们枚举机房,直接花时间,然后贪心的选择当前选过的节点,删除一些(可以不删)直到使总时间 m,这样我们求个 max 即可,可以用优先队列维护当前选的机房。

  • 这样我们相当于 固定选一个节点,贪心的找其他节点使贡献最大,这里贪心的找最小时间,显然是正确的。

复杂度 O(nlogn)

代码

posted @   oXUo  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
网站统计
点击右上角即可分享
微信分享提示