求助 CF7B #8WA

CF7B Memory Manager

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带师


|