一、算法分析
模拟类题目,思路都在代码和注释里了。读题难度不大,其中一个小坑是erase后面跟的是任意整数,也就是说可能是负数。个人觉得难点在于对于alloc操作的优化和deflagment操作的实现,其中deflagment自己想了很久才想到只要记录左边空位数量就能移了。
二、代码及注释
//内存块的编号为连续的正整数编号
//一道纯模拟题
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int t,m;
const int N=105;
int st[N]; //记录内存区域的状态
int l[N],r[N];
//几个重要思想:
//1.因为内存块的独占性,所以可以用两个数组l和r来标记内存块的左右端点,在这种情况下,判断一个内存是否存在即直接判断其l或者r是否为0或-1即可
//2.对于alloc操作也可以进行优化,即当两端点之间的点被占用时,下一步直接跳到右端点的下一个作为新的左端点开始进行判断
//3.对于向左归并的操作,则直接利用l和r重新计算即可
int main(){
cin>>t>>m;
int cnt=0; //分配的内存块的编号
while(t--){
string str;
int state;
cin>>str;
if(str[0