当前位置: 首页 > news >正文

ARC201B Binary Knapsack

比赛中模拟赛的题,先来记录一下考场做法。

首先发现和普通背包问题的唯一不同就在于空间都是 \(2\) 的整数次幂的,这提示我们从这里下手。那么关于这种,我们只可能与二进制有关了,于是我们考虑选择一个在二进制上的贡献,并从高位向低位上看。我们发现,如果最高位上为 \(1\),那么这里也只能选一个数,而如果不选的话下一位可以多选两个数。这给了我们思路。我们设 \(f(i,j)\) 表示现在考虑到了第 \(i\) 位,至多选 \(j\) 个数。那么之后发现,如果这一位上要选 \(k\) 个数的话,那么一定是选前 \(k\) 大的,那么只需要枚举这一位选几个即可。定义 \(S(i)\) 为这一位的有序集合,\(S(i,j)\) 表示前 \(j\) 个数的和。定义 \(p_x^i\) 表示 \(x\) 的第 \(i\) 二进制位的值,那么有转移:

\[f(i,j)=\max_{k=0}^{\min(|S_i|,j)}\left\{S(i,k)+f(i-1,2(j-k)+[p_m^{i-1}==1])\right\} \]

其中 \(f(0,j)=S(0,j)\),这样我们就获得了一个 \(O(n^2\log m)\) 的做法。但是还是不能够通过本题。并且这个东西看起来也不是非常好维护的样子。那么也一定有一些性质在里面。之后通过打表注意到对于同一个 \(i\) 满足决策单调性,于是就双指针优化到了 \(O(n\log m)\) 了。

但是比赛时要求的是这个题的加强版,还额外有 \(Q\) 次不独立的修改,每一次将一个价值加 \(1\),并求。这个就没有办法用上面这个动规做了,需要额外想办法。

http://www.jsqmd.com/news/22636/

相关文章:

  • 单个神经元手写数字识别
  • LDC
  • 多元线性回归
  • 完整教程:由JoyAgent观察AI Agent 发展
  • Linux 内核空间 并发竞争处理 共享资源线程同步 - 实践
  • TF1和TF2
  • 单变量线性回归tensorflow版
  • Spark计算引擎
  • 【轨物方案】变频器物联网软硬件一站式解决方案 - 详解
  • 人工智能初了解
  • 173天隧道技术篇防火墙组策略ICMPDNSSMB协议出网判断C2上线解决方案
  • Hbase分布式数据库
  • 软考六
  • MapReduce并行计算框架
  • 应用安全 ---
  • 实用指南:3DGS 如何理解它?
  • HDFS文件系统
  • Java 类加载器
  • 面试总被追问k8s调度器工作原理, 收藏 == 学废
  • 题解:十二重计数法
  • Wyn 商业智能软件:3D 可视化大屏搭建与设备利用全指南
  • 什么是Java Lambda
  • Java 代理
  • 《算法与数据结构》第七章[算法2]:广度优先搜索(BFS) - 指南
  • 中转API为什么比官方更便宜?AI中转站成本揭秘
  • Java 混合编程
  • Java 语法糖
  • JAVA RMI编程
  • 大资料毕业设计选题推荐-基于大数据的全球产品库存数据分析与可视化系统-大材料-Spark-Hadoop-Bigdata
  • 纸笔群群友命题乱做