在 C++ 语言中,变量的值以二进制形式存储在计算机内存中。我们的程序不需要知道变量存储的确切位置,因为可以通过名称来引用它们。
程序需要了解的是每个变量中存储的数据类型。存储一个简单的整数与存储一个字符或一个大型浮点数是不同的。尽管它们都由二进制表示,但它们的解释方式不同,且在许多情况下,它们占用的内存大小也不相同。
基本数据类型由语言直接实现,代表了大多数系统原生支持的基本存储单元。它们主要可以分为四类:
字符类型:它们可以表示单个字符,例如 ‘A’ 或 ‘$’。最基本的类型是 char,它是一个字节的字符。
数值整型:它们可以存储整数值,例如 7 或 1024。它们有多种大小。最基本的是 int,它是一个四字节的整数。long long 是一种更大的类型,占用的内存是 int 的两倍。在某些新系统中可能会出现更宽的整数类型 __int128,它是一个 16 字节的整数,但很少用到。
浮点类型:它们可以表示实数值,例如 3.14 或 0.01,根据所使用的三种浮点类型中的哪一种,精度水平会有所不同。float、double 和 long double 分别对应 int、long long 和 __int128,前者占用的内存大小与后者相同。
布尔类型:布尔类型在 C++ 中称为 bool,只能表示两种状态之一:true 或 false。它是一个字节的类型。
现在你有一段 C++ 代码,其中有 $n$ 行用于申请变量和数组。此外,我已经检查过这段代码,可以保证所有变量和数组都是全局的,且没有任何冲突。
作为一个初学者,代码中的每一行可能只申请一个变量或一个数组;所有这些变量和数组的类型都在上述说明中提到;代码中不会出现未提及的其他类型。你的任务是计算这段代码总共使用的内存大小。请以 Kibibyte(1 Kibibyte 等于 1024 字节)为单位输出你的答案,并向上取整到最接近的整数。
输入格式
输入包含多个测试用例,第一行包含一个正整数 $T$,表示测试用例的数量,最多为 100。
对于每个测试用例,第一行包含一个正整数 $n$,最多为 1000,表示代码中申请(即分配内存)变量和数组的总行数。接下来的 $n$ 行中,每一行可能以以下形式声明一个变量:
type variable_name;
或者以以下形式声明一个新数组:
type array_name[array_size];
其中 type 必须是上述类型名称之一。所有的 variable_name 和 array_name 都是仅包含小写字母且长度不超过 10 的不同字符串,所有的 array_size 都是不超过 $10^5$ 的正整数。除了类型名称中或类型名称后的空格外,输入中不允许有额外的空格。换句话说,我们保证输入中不会出现连续的空格。
输出格式
对于每个测试用例,输出一行包含 “Case #x: y”(不含引号),其中 $x$ 是从 1 开始的测试用例编号,$y$ 表示以 Kibibyte 为单位的总分配内存大小,并向上取整到最接近的整数。
样例
输入 1
2 8 bool a; char b; int c; long long d; __int128 e; float f; double g; long double h; 1 int a[1000];
输出 1
Case #1: 1 Case #2: 4
说明
在第二个样例中,内存使用量为 4000 字节,应向上取整为 4 Kibibytes。