CF309C Memory for Arrays

题目描述

你来到公司,打开电脑开始编码,很少注意到内存(RAM)在整个过程中扮演的角色。本题中,你需要解决一个在日常使用电脑时可能遇到的问题。 我们将内存抽象为一系列可以存放数据的单元格。其中一些单元格已经存有数据,另一些是空的。所有连续的空单元格序列被称为“内存块”(memory clusters)。因此,一个内存块就是一些连续的空内存单元格组成的序列。 你现在有恰好 $n$ 个内存块,第 $i$ 个内存块包含 $a_i$ 个单元格。你的程序中需要存放 $m$ 个数组,第 $j$ 个数组需要占用 $2^{b_j}$ 个连续的内存单元格。可能没有足够的内存来存放所有的数组,所以你的任务是判断最多可以存放多少个数组到这些可用的内存块中。当然,数组不能跨内存块存放,也不能有内存单元格被两个数组共享。

输入格式

输入的第一行为两个整数 $n$ 和 $m$($1 \leq n, m \leq 10^6$)。 第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($1 \leq a_i \leq 10^9$)。 第三行包含 $m$ 个整数 $b_1, b_2, \ldots, b_m$($1 \leq 2^{b_i} \leq 10^9$)。

输出格式

输出一个整数,表示最多可以存放多少个数组。

说明/提示

在第一个样例中,内存块的大小分别为 $8, 4, 3, 2, 2$,数组的大小分别为 $8, 4, 4$。答案为 $2$ 的一种方式是将大小为 $8$ 的数组放入大小为 $8$ 的内存块,再将一个大小为 $4$ 的数组放入大小为 $4$ 的内存块。另一种方式是将两个大小为 $4$ 的数组都放入同一个大小为 $8$ 的内存块中。 在第二个样例中,共有 $10$ 个大小为 $1$ 的内存块和 $6$ 个大小为 $1$ 的数组。可以任意选择 $6$ 个内存块,将所有数组都存入其中。 由 ChatGPT 5 翻译