Micro_Seven @ 2020-05-26 15:31:14
#include <bits/stdc++.h>
using namespace std;
#define DEBUG
class File; //一个文件的信息
class RAM; //内存条
inline string to_string(unsigned short);
class File
{
public:
unsigned short addres; //此文件的起始地址
unsigned short len; //此文件的长度(大小)
unsigned short num; //此文件的编号
File(unsigned short addres, unsigned short len, unsigned short num) :
addres(addres), len(len), num(num) {}
};
class RAM
{
public:
vector<File> files;
unsigned short file_num; //新分配的内存空间(看作文件)的编号
unsigned short m; //内存大小
RAM(unsigned short m) : files(), file_num(1), m(m) {}
inline string alloc(unsigned short); //分配内存空间(新文件)
inline string erase(unsigned short); //释放内存空间(删除文件)
inline void defragment(); //碎片整理文件
};
int main()
{
#ifndef DEBUG
ios::sync_with_stdio(false);
cin.tie(NULL);
#endif
unsigned short t; //操作次数
unsigned short m; //内存大小
string op_type; //本次操作(命令)的类型
unsigned op_arg; //本次操作(命令)的参数
//输入t和m
cin >> t >> m;
RAM ram(m); //内存条
for(unsigned short i=0;i<t;++i)
{
//读入本次操作指令
cin >> op_type;
//判断本次是什么操作,并执行
if(op_type == "alloc")
{
cin >> op_arg;
cout << ram.alloc(op_arg) << endl;
}
#ifdef DEBUG
else if(op_type == "break")
return 0;
#endif
else if(op_type == "erase")
{
cin >> op_arg;
string str = ram.erase(op_arg);
cout << str << (str == "" ? "" : "\n") << flush;
}
else
ram.defragment();
}
return 0;
}
inline string to_string(unsigned short n)
{
ostringstream oss;
oss << n;
return oss.str();
}
inline string RAM::alloc(unsigned short len)
{
//特判内存中没有文件
if(files.empty())
{
if(len <= m)
{
files.insert(files.begin(), File(1, len, file_num));
return to_string(file_num++);
}
else
return "NULL";
}
//特判内存最前面有没有空间
if(files.front().addres-1 >= len)
{
files.insert(files.begin(), File(1, len, file_num));
return to_string(file_num++);
}
//看看文件与文件之间有没有空间塞得下这个新文件
for(vector<File>::iterator ptr1=files.begin()+1,ptr2=ptr1+1,end=files.end();
ptr2<end;++ptr1,++ptr2)
{
if(ptr2->addres-(ptr1->addres+ptr1->len) >= len)
{
files.insert(ptr2, File(ptr1->addres + ptr1->len, len, file_num));
return to_string(file_num++);
}
}
//看看内存尾部能不能塞得下这个新文件
if(m-(files.back().addres+files.back().len)+1 >= len)
{
files.insert(files.end(), File(files.back().addres+files.back().len, len, file_num));
return to_string(file_num++);
}
else return "NULL";
}
inline string RAM::erase(unsigned short file_num)
{
//顺序查找
for(vector<File>::iterator ptr=files.begin(),end=files.end();ptr!=end;++ptr)
if(ptr->num == file_num)
{
files.erase(ptr);
return "";
}
return "ILLEGAL_ERASE_ARGUMENT";
}
inline void RAM::defragment()
{
//特判内存中没有文件的情况
if(files.empty())
return;
files.front().addres = 1;
for(vector<File>::iterator ptr1=files.begin()+1,ptr2=ptr1+1,end=files.end();
ptr2<end;++ptr1,++ptr2)
{
ptr2->addres = ptr1->addres + ptr1->len;
}
if(files.size() > 1)
files.back().addres = (files.end() - 2)->addres + (files.end() - 2)->len;
}
by Thomasguo666 @ 2020-05-26 16:32:28
orz OOP带师