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

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

题目描述

在 C++ 语言中,变量的值以零和一的形式存储在计算机内存的某个位置。我们的程序不需要知道变量存储的确切位置,因为可以通过变量名直接引用它。

程序需要了解的是存储在每个变量中的数据类型。存储一个简单的整数与存储一个字母或一个大的浮点数并不相同。尽管它们都用零和一表示,但它们的解释方式不同,而且在很多情况下,它们占用的内存量也不相同。

基本数据类型 由语言直接实现,代表了大多数系统原生支持的基本存储单元。它们主要可以分为四类。

  • 字符类型:可以表示单个字符,例如 'A''$'。最基本的类型是 char,它是一个 11 字节的字符。
  • 整数类型:可以存储一个整数值,例如 7710241024。它们有多种大小。最基本的是 int,它是一个 44 字节的整数。long long 是一种更大的整数类型,占用的内存是 int 的两倍。在某些新系统中可能会出现一种更宽的整数类型 __int128,它是一个 1616 字节的整数,很少使用。
  • 浮点类型:可以表示实数值,例如 3.143.140.010.01,根据使用的三种浮点类型的不同,精度也不同。floatdoublelong double 分别对应于 intlong long__int128,其中前者占用的内存量与后者分别相同。
  • 布尔类型:在 C++ 中称为 bool 的布尔类型,只能表示两种状态之一,truefalse。它是一个 11 字节的类型。

现在你有一段 C++ 代码,其中有 nn 行申请了若干变量和数组。此外,我已经检查过,因此可以保证这段代码中的所有变量和数组都是全局的,不存在任何冲突。

作为新手,你代码中的每一行只能申请一个变量或一个数组;所有这些变量和数组的类型都如上文所述;任何未提及的其他类型都不能出现在代码中。你的任务是计算这段代码总共使用的内存量。将答案以 Kibibyte(11 Kibibyte 等于 10241024 字节)为单位输出,并向上取整到最接近的整数。

输入格式

输入包含多个测试用例,第一行包含一个正整数 TT 表示测试用例的数量,最多为 100100

对于每个测试用例,第一行包含一个正整数 nn(最多为 10001000),表示代码中申请(即分配内存)变量和数组的总行数。接下来的 nn 行,每行可能按如下形式声明一个变量

  • type variable name;

或者按如下形式声明一个新数组

  • type array name[array size];

其中 type 必须是上述类型名称之一。所有变量名和数组名都是仅包含小写字母的不同字符串,长度最多为 1010,所有数组大小都是最多为 10510^5 的正整数。除了某些类型名称中间或之后的空格,输入中不允许有多余的空格。换句话说,我们保证输入中不会出现连续的空格。

输出格式

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

2
8
bool a;
char b;
int c;
long long d;
__int128 e;
float f;
double g;
long double h;
1
int a[1000];
Case #1: 1
Case #2: 4

提示

在第二个样例中,内存用量为 40004000 字节,应向上取整为 44 Kibibyte。

翻译由 DeepSeek V4 Pro 完成