P17401 [ICPC 2018 Shenyang R] How Much Memory Your Code Is Using?

题目描述

在 C++ 语言中,变量的值以零和一的形式存储在计算机内存的某个位置。我们的程序不需要知道变量存储的确切位置,因为可以通过变量名直接引用它。 程序需要了解的是存储在每个变量中的数据类型。存储一个简单的整数与存储一个字母或一个大的浮点数并不相同。尽管它们都用零和一表示,但它们的解释方式不同,而且在很多情况下,它们占用的内存量也不相同。 **基本数据类型** 由语言直接实现,代表了大多数系统原生支持的基本存储单元。它们主要可以分为四类。 * **字符类型**:可以表示单个字符,例如 `'A'` 或 `'$'`。最基本的类型是 `char`,它是一个 $1$ 字节的字符。 * **整数类型**:可以存储一个整数值,例如 $7$ 或 $1024$。它们有多种大小。最基本的是 `int`,它是一个 $4$ 字节的整数。`long long` 是一种更大的整数类型,占用的内存是 `int` 的两倍。在某些新系统中可能会出现一种更宽的整数类型 `__int128`,它是一个 $16$ 字节的整数,很少使用。 * **浮点类型**:可以表示实数值,例如 $3.14$ 或 $0.01$,根据使用的三种浮点类型的不同,精度也不同。`float`、`double` 和 `long double` 分别对应于 `int`、`long long` 和 `__int128`,其中前者占用的内存量与后者分别相同。 * **布尔类型**:在 C++ 中称为 `bool` 的布尔类型,只能表示两种状态之一,`true` 或 `false`。它是一个 $1$ 字节的类型。 现在你有一段 C++ 代码,其中有 $n$ 行申请了若干变量和数组。此外,我已经检查过,因此可以保证这段代码中的所有变量和数组都是全局的,不存在任何冲突。 作为新手,你代码中的每一行只能申请一个变量或一个数组;所有这些变量和数组的类型都如上文所述;任何未提及的其他类型都不能出现在代码中。你的任务是计算这段代码总共使用的内存量。将答案以 Kibibyte($1$ Kibibyte 等于 $1024$ 字节)为单位输出,并向上取整到最接近的整数。

输入格式

输入包含多个测试用例,第一行包含一个正整数 $T$ 表示测试用例的数量,最多为 $100$。 对于每个测试用例,第一行包含一个正整数 $n$(最多为 $1000$),表示代码中申请(即分配内存)变量和数组的总行数。接下来的 $n$ 行,每行可能按如下形式声明一个变量 * `type variable name;` 或者按如下形式声明一个新数组 * `type array name[array size];` 其中 `type` 必须是上述类型名称之一。所有变量名和数组名都是仅包含小写字母的不同字符串,长度最多为 $10$,所有数组大小都是最多为 $10^5$ 的正整数。除了某些类型名称中间或之后的空格,输入中不允许有多余的空格。换句话说,我们保证输入中不会出现连续的空格。

输出格式

对于每个测试用例,输出一行 `"Case #x: y"`(不含引号),其中 $x$ 是测试用例编号(从 $1$ 开始),$y$ 表示总共分配的内存量的 Kibibyte 数,并向上取整到最接近的整数。

说明/提示

在第二个样例中,内存用量为 $4000$ 字节,应向上取整为 $4$ Kibibyte。 翻译由 DeepSeek V4 Pro 完成