题面翻译

CF7B Memory Manager

Prurite @ 2018-01-30 19:38:29

题目描述

第一个国家级操作系统——BerlOS就要发布了。但是,它的一些功能还没有完善,比如内存管理系统。在开发者的计划里,第一版里的内存管理系统是简单并且是线性的。它将会支持以下操作:

  • *alloc n* —— 在内存中分配n字节的空间。此命令将返回已分配的内存块的编号x。

  • *erase x* —— 释放编号为x的内存块。

  • *defragment* —— 碎片整理,将所有内存块全部向内存的起点靠拢并且不改变它们的顺序。

整条内存一共有m个字节,每个字节依次编号为1,2,...,m。

操作 *alloc* 有一个参数n,表示需要分配n字节大小的内存块。在执行这个操作时,系统将把一块最靠近内存起点的,长度为n的连续空闲字节分配到一个内存块(这块内存块内的所有字节将被标记为“已使用”)。这个操作的返回值为这块内存块的编号。如果没有符合条件的内存块,返回 *NULL* 。

操作 *erase* 有一个参数x,表示需要释放的内存块的编号。它将释放这个内存块(这块内存块内的所有字节将被标记为“空闲”)。如果成功释放,不返回值;如果编号为x的内存块不存在,返回 *ILLEGAL_ERASE_ARGUMENT* 。

操作 *deflagment* 没有任何参数。它只是将所有内存块向前依次(编号小的地方)挪动直到它们紧挨在一起。(不改变它们的顺序)

你将用连续的正整数(1,2,...)作为每一个内存块的编号。比如,第i次分配的内存块编号为i。你的任务是依次输出所有 *alloc* 指令的返回值,以及所有执行失败的 *erase* 指令的返回值。

输入输出格式

输入格式

输入文件的第一行包括两个正整数 *t* 和 *m* 。 *t* 表示操作次数, *m* 表示内存大小(为m字节)。接下来的t行为每一次的命令。命令有以下三种:*alloc* 命令,后接一个整数 *n* ; *erase* 命令,后接一个整数 *x* ; *defragment* 命令。

输出格式

输出文件的每一行依次为每次执行的 *alloc* 函数的返回值或执行失败的 *erase* 函数返回的 *ILLEGAL_ERASE_ARGUMENT* 。


by Prurite @ 2018-01-30 19:43:13

几个感想:

  1. 这篇题全文翻译几乎花了我一节晚自习(40分钟)。

  2. 我觉得发一个“正在工作”的讨论,避免他人重复劳动并没有违反社区规范。

  3. 我打字打到一半突然输不进去了,心里一惊,赶紧把之前打的内容复制了一遍。果然,刷新就提醒"讨论被删除”。如果我没有复制这半个小时的心血可就白费了啊……建议加入“草稿箱”,同时在讨论编辑栏里加入“保存到草稿”功能,避免洋洋洒洒打了几页然后因为一些意外情况导致心血付诸东流。


by FlierKing @ 2018-01-30 21:24:07

@星烁晶熠辉 感谢你的贡献。对于意外丢失的问题,推荐你现在本地写,然后复制到洛谷上进行提交,不容易发生丢失的问题。


by yjjr @ 2018-01-30 21:24:50

@星烁晶熠辉 感谢您的贡献,建议已经反馈


by Prurite @ 2018-01-30 21:28:33

另外:erase执行错误的返回值应该没有\吧


|