随笔 - 27  文章 - 0  评论 - 1  阅读 - 636

ABC 312 F Cans and Openers

题意
现在有三种物品,给出的格式为(t[i],x[i])如下:

  1. 拉环罐头,被标记为t[i]=0,得到即食,可以得到x[i]的开心值。
  2. 普通罐头,被标记为t[i]=1,需要用开罐器打开,食用后可以得到x[i]的开心值。
  3. 开罐器,被标记为t[i]=2,使用后可以打开x[i]个普通罐头。

现在有N个这样的物品,你可以选择其中的M个,求你可以获得的最大开心值。

思路
首先我们可以很轻松的想到暴力的方法,即循环枚举选择的拉环罐头的个数和普通罐头的个数,然后求解,这样显然会超时。我们现在采取贪心的思路:当我们确定拉环罐头的个数i后,那么剩下的much-i个物品,我们肯定是喜欢其中普通罐头的个数是越多越好的,毕竟在拉环罐头的个数确定之后,唯一获得开心值的途径就是普通罐头,但是普通罐头需要开罐器打开,那么两者间就形成了一个相互制约的关系:普通罐头越多,开罐器越少,不能全部开完;普通罐头越少,开罐器越多,可以全部开完。这样大致形成了一个单调关系,那么这个时候我们可以采取二分答案:在much-i里二分出普通罐头的选取数量x,在保证能全部打开的情况下的最大普通罐头数量。那么这个时候check函数就很好些了,我们同时维护三个前缀和,当普通罐头的数量x确定后,我们就得到了开罐器的数量,即much-i-x,我们再查看开罐器前缀和的数量前缀和是否大于等于x即可。

代码
https://atcoder.jp/contests/abc312/submissions/54068470

posted on   Linear_L  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示