#P2340. Memory management
Memory management
你知道吗?在一场学校学生编程竞赛中,一种新的计算机语言正在开发中,我们称之为D++。一般来说,你是否了解它并不重要。但要运行用D++编写的程序,我们需要一个新的操作系统,它应该相当强大和复杂,运行快速且具备诸多功能,但所有这些都将在未来实现。
而现在你需要……不,你不需要为这个操作系统设计名称,而是要为这个新操作系统编写第一个模块,当然就是内存管理模块。让我们讨论一下它的预期工作方式。
我们的操作系统将以称为“块”的单元分配内存,这些块将用从1到N的整数编号。当操作系统需要更多内存时,会向内存管理模块发出请求。为处理该请求,内存管理模块应找到编号最小的可用内存块。你可以假设存在足够的块来处理所有请求。
现在我们需要定义“可用块”一词的含义。在首次向内存管理模块发出请求时,所有块都被视为可用。此外,当某个块在T分钟内没有收到任何请求时,它会重新变为可用状态。
你可能会对“已分配块的请求”这一概念感到疑惑,“对已分配块的请求”意味着什么?答案很简单:在任何时候,内存管理模块都可能被请求访问某个给定的块。处理该请求时,内存管理模块应检查所请求的块是否确实已分配。如果已分配,该请求被视为成功,并且该块将继续保持分配状态T分钟;否则,请求失败。
以上就是内存管理模块的算法概述。你需要为N=和T=分钟实现这些算法。
输入
输入的每一行包含一个内存块分配请求或内存块访问请求。内存分配请求的格式为:
<Time> +
其中<Time>
是一个不大于的非负整数,时间以秒为单位。内存块访问请求的格式为:
<Time> . <BlockNo>
其中<Time>
满足上述内存分配请求的条件,<BlockNo>
是范围从1到N的整数。
输出
对于输入的每一行,你应精确输出一行请求处理结果。对于内存分配请求,你需输出一个整数——所分配块的编号。如前所述,你可以假设每个请求都能被满足,同时分配的块数不会超过N。对于内存块访问请求,你应输出唯一的字符:
'+' —— 请求成功(即该块确实已分配)
'-' —— 请求失败(即给定编号的块是可用的,因此无法访问)
请求按时间递增顺序排列,具有相同时间的请求按输入中的出现顺序处理。
输入数据1
1 +
1 +
1 +
2 . 2
2 . 3
3 . 30000
601 . 1
601 . 2
602 . 3
602 +
602 +
1202 . 2
输出数据1
1
2
3
+
+
-
-
+
-
1
3
-