SP1454 MEMDIS - Memory Distribution

题目描述

EMS 内存(简称为内存)是计算机关键资源之一。当程序执行时,计算机必须为其分配内存。 内存分配的经典步骤如下: - 内存的基本单位是「单元」,每个单元都有一个固定的整数编号,称为其「地址」。地址从 0 开始编号。如果两个单元的地址是相邻的整数,则称这两个单元是逻辑上连续的。我们把从地址 $i$ 开始的 $s$ 个连续单元称为一段长度为 $s$ 的内存段,起始地址为 $i$。 - 各个程序在运行时需要申请内存。每个程序通过以下信息描述:申请时间 $X$、所需内存单元数 $M$ 和运行时长 $P$。程序运行期间(即从开始时间 $T$ 到 $T+P$,包括起始时间,不包括结束时间),这 $M$ 个单元都不能被其它程序使用。 - 假如某程序在 $X$ 时刻申请 $M$ 个单元,并需要运行 $P$ 长时间,则: - (A) 如果在 $X$ 时刻内存中存在一个连续的段,这个段未被占用且长度为 $M$,那么计算机会将这 $M$ 个单元分配给该程序。如果存在多个符合条件的段,计算机会选择起始地址最小的一个。 - (B) 若在 $X$ 时没有这样的内存段,该程序将进入等待队列。如果稍后某一时刻发现有适合的段,并且队列头部的程序正是该程序,计算机会立即弹出该程序并为其分配内存,遵循 (A) 的规则。在分配过程中,队列中非头部的程序无法在头部程序之前启动。

输入格式

共有十个测试用例(按顺序提供,需要依次处理)。每个测试用例: 第一行是一个整数 $N$,表示内存单元的数量,地址范围为 $0 \ldots n-1$。接下来有少于 10000 行的数据,每行包含三个整数 $X, M (M \leq N), P$,用于描述一个程序。以三个零组成的行标志着测试用例结束。程序的数据已经按申请时间 $X$ 排序。 输入和输出中的所有数字均小于 $10^9$。

输出格式

对于每个测试用例,请输出两行。第一行是一个整数,表示所有程序都顺利运行并停止的时间。第二行是一个整数,表示曾经进入等待队列的程序数量。 **本翻译由 AI 自动生成**