CF436E - Cardboard Box 题解

只讲贪心做法。

一、反悔贪心

考虑如何使选的星星总数多一。显然,有如下几种方式:

  • 选一个之前没选过的位置 i,答案加上 ai

  • 选一个之前选过一次的位置 i,答案加上 biai

  • 对于一个之前选过一次的位置 i,再找到一个没有选过的位置 j,反悔掉 i,并选两次 j,答案加上 bjai

  • 对于一个之前选过两次的位置 i,再找到一个没有选过的位置 j,反悔掉 i 的第二次选择,并选两次 j,答案加上 bj(biai)=bjbi+ai

总结一下,我们需要分别维护 ai,bi,ai,aibi,biai 的最值,使用五个堆即可。但是每个策略可能会对多个堆进行修改,比较复杂,不推荐。

时间复杂度 O(nlogn)

二、直接贪心

考虑每次选两个星星,那么我们需要权衡的是选 ai+aj 还是 bi

定义:2 物品表示根据以上选择方式,一次用掉 bi,对答案贡献为 2 的物品,剩下的都是 1 物品(如果其 b=2,会分成 aba 两次选)。

开两个堆,存储 1 物品和 2 物品,然后每轮选择进行如下过程:

  • 记录每个数是作为 2 物品被扔掉还是 1 物品。然后对于每个堆,把所有不合法的扔掉。

  • 取出 1 堆的最小值和次小值 amn,ase2 堆的最小值 bmn(若不存在视为 +)。

  • amn+asebmn:记录下每个数被选的次数,令 amn,ase 对应的 cntcnt+1,并标记为作为 1 物品使用。若此时 cnt=1,说明选择的是 a,再将 ba 扔进去。然后把 bmn 扔回去(如果是 +,忽略)。

  • 否则:使用 bmn,设置其 cnt=2,作为 2 物品被使用。然后将 amn,ase 塞回去。

这样选择方案就输出 cnt 即可。

但是这样做有一个问题:如果 w 是奇数怎么办。此时我们可以加入一个值和编号都为 01 物品进去,并标记 cnt=1,这样它就只会被用一次。

时间复杂度 O(nlogn)

Code

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