会员专享
请先
登录,登录后可使用今日免费解锁;
开通会员后可解锁完整内容。
解题思路
一句话总结: 直接算出每个请求要占几个 Block,从占用block少的元素开始一个个塞进去,塞到装不下为止,塞进去的个数就是答案。
核心思路
题面允许在后续决策中撤销先前已接受的请求,这条规则把“必须按顺序在线决策”的约束消掉了:任何一个最终合法的请求集合,都可以先把这些请求全部接受、再在必要时撤销被拒绝的那些得到;反过来,任何时刻的最终集合也只是原请求的一个子集。所以顺序不影响答案,问题等价于——从 n 个请求中选出尽可能多的请求,使它们的 Block 占用之和不超过 m。
第 i 个请求的代价是 ci=ceil(len[i]/k),每个请求的价值都是 1。价值全都相同、代价都是正数,这种情况下的最优策略就是先装最便宜的:把 ci 从小到大排序,依次尝试加入,只要当前占用加上 ci 不超过 m 就接受,第一次放不下就停止(它后面只会更大,没有放得下的可能)。