题目来源
题目描述
题目解析
简单题。关键点在于:
- 申请内存时需要知道哪些内存已经被使用了
- 释放内存的时候要知道要释放多长的内存
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <functional>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <map>
#include <random>
#include <ctime>
#include <iterator>
using namespace std;
class MemPool{
public:
MemPool(){
m_status = std::vector<bool >(numTotal, 100);
}
int Request(int size){ // 要求分配多少字符
int ans = -1;
if(size <= 0){
return ans;
}
for (int i = 0; i <= numTotal - size; ++i) {
int j = 0;
while (j < size){
if(m_status[i + j]){
break;
}
j++;
}
if(j == size){
ans = i;
break;
}
}
if(ans == -1){
return ans;
}
m_used[ans] = size;
for (int i = 0; i < size; ++i) {
m_status[i + ans] = true;
}
return ans;
}
bool Release(int startAddr){
if(m_used.count(startAddr)){
return false;
}
int size = m_used[startAddr];
for (int i = startAddr; i < size; ++i) {
m_status[startAddr + i] = false;
}
return true;
}
private:
std::vector<bool > m_status; // false时表示未被分配
std::map<int, int> m_used; // key为分配的首地址, value为分配的长度
static constexpr int numTotal = 100;
};
int main(){
int N ;
std::cin >> N;
MemPool pool;
for (int i = 0; i < N; ++i) {
std::string str;
std::cin >> str;
std::string cmd = str.substr(0, str.find_first_of('='));
int num = stoi(str.substr(str.find_first_of('=') + 1));
if(cmd == "REQUEST"){
int size = num;
int result = pool.Request(size);
if (result != -1) {
cout << result << endl;
} else {
cout << "error" << endl;
}
}else{
int addr = num;
if (!pool.Release(addr)) {
cout << "error" << endl;
}
}
}
return 0;
}