Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <list>
- #include <queue>
- #include <set>
- using std::cerr;
- using std::cin;
- using std::endl;
- using std::cout;
- using std::set;
- using std::pair;
- using std::list;
- using std::vector;
- using std::make_pair;
- using std::priority_queue;
- const int SIZE = 10;
- class Segment {
- public:
- int length;
- int end_time;
- bool used_segment;
- int start_coordinate;
- Segment(int start = 0, int end = 0, int len = 0, bool used = false) : start_coordinate(start),
- end_time(end),
- length(len),
- used_segment(used) {}
- };
- typedef list<Segment>::iterator lSi;
- typedef pair<Segment, lSi> pSlS;
- struct FreeSegmentsCompare {
- bool operator() (const pSlS& first, const pSlS& second) {
- return make_pair(first.first.length, first.first.start_coordinate) <
- make_pair(second.first.length, second.first.start_coordinate);
- }
- };
- struct ProcessingTaskCompare {
- bool operator() (const pSlS& first, const pSlS& second) {
- if (first.first.end_time != second.first.end_time)
- return first.first.end_time > second.first.end_time;
- return first.first.length < second.first.length;
- }
- };
- struct SegmentQueueCompare {
- bool operator() (const pSlS& first, const pSlS& second) {
- if (first.first.end_time != second.first.end_time)
- return first.first.end_time > second.first.end_time;
- return first.first.length < second.first.length;
- }
- };
- class MemoryMenager {
- int memory_length;
- list<Segment> segments;
- set<pSlS, FreeSegmentsCompare > free_segments;
- priority_queue<pSlS, vector<pSlS>, ProcessingTaskCompare> processing_tasks;
- int PopTask() {
- if (processing_tasks.empty())
- throw std::logic_error("Try to erase empty tasks.");
- pSlS task = processing_tasks.top();
- processing_tasks.pop();
- lSi it = task.second;
- int free_segment_size = it->length;
- int segment_start = it->start_coordinate;
- int time = it->end_time;
- if (it != segments.begin()) {
- --it;
- if (!it->used_segment) {
- free_segment_size += it->length;
- segment_start = it->start_coordinate;
- free_segments.erase(free_segments.lower_bound(
- make_pair(Segment(it->start_coordinate, 0, it->length, false), segments.begin())));
- lSi tmp = it;
- ++it;
- segments.erase(tmp);
- } else
- ++it;
- }
- ++it;
- if (it != segments.end()) {
- if (!it->used_segment) {
- free_segment_size += it->length;
- free_segments.erase(free_segments.lower_bound(
- make_pair(Segment(it->start_coordinate, 0, it->length, false), segments.begin())));
- lSi tmp = it;
- --it;
- segments.erase(tmp);
- } else
- --it;
- } else
- --it;
- *it = Segment(segment_start, 0, free_segment_size, false);
- free_segments.insert(make_pair(Segment(segment_start, 0, free_segment_size, false), it));
- return time;
- }
- public:
- MemoryMenager(int memory_size) : memory_length(memory_size) {
- Segment free_segment = Segment(0, 0, memory_size, false);
- segments.push_back(Segment(0, 0, memory_size, false));
- free_segments.insert(make_pair(free_segment, segments.begin()));
- }
- int AddTask(int length, int duration, int time) {
- if (memory_length < length)
- throw std::logic_error("Size of task bigger then all memory.");
- while(free_segments.lower_bound(make_pair(Segment(0, 0, length, false), segments.begin())) == free_segments.end()) {
- time = PopTask();
- }
- auto it = free_segments.lower_bound(make_pair(Segment(0, 0, length, false), segments.begin()));
- pSlS free_segment = *it;
- free_segments.erase(it);
- if (free_segment.first.length == length) {
- free_segment.second->used_segment = true;
- free_segment.second->end_time = time + duration;
- processing_tasks.push(make_pair(Segment(free_segment.first.start_coordinate, time + duration, length, true), free_segment.second));
- return time;
- }
- free_segments.insert(make_pair(Segment(free_segment.first.start_coordinate, 0, free_segment.first.length - length, true), free_segment.second));
- free_segment.second->length = free_segment.first.length - length;
- Segment segment = Segment(free_segment.first.start_coordinate + free_segment.second->length,
- time + duration,
- length,
- true);
- auto increased = free_segment.second;
- ++increased;
- auto fs = segments.insert(increased, segment);
- processing_tasks.push(make_pair(segment, fs));
- return time;
- }
- };
- //firstfit
- list<Segment> ram;
- priority_queue<pSlS, vector<pSlS>, SegmentQueueCompare> q;
- int gl_time = 0;
- void initialize() {
- ram.push_front(Segment(0, -1, SIZE, false));
- }
- void Remove() {
- int rez = 0;
- pSlS top = q.top();
- lSi it = top.second;
- lSi pit = it;
- lSi nit = it;
- //проверять есть ли пред и след
- if (it != ram.begin() && it != ram.end()) {
- pit--;
- nit++;
- gl_time = top.first.end_time;
- if (it == ram.begin()) {
- if((nit)->used_segment) {
- ram.erase(ram.begin());
- } else {
- it->length += nit->length;
- ram.erase(nit);
- }
- } else if(it == ram.end()) {
- if((pit)->used_segment) {
- ram.erase(ram.end());
- } else {
- pit->length += it->length;
- ram.erase(it);
- }
- } else {
- if(pit->used_segment && nit->used_segment) {
- it->used_segment = false;
- } else if (!pit->used_segment && !nit->used_segment) {
- it->used_segment = false;
- it->length += pit->length + nit->length;
- ram.erase(pit);
- ram.erase(nit);
- } else if(pit->used_segment && !nit->used_segment) {
- it->length += nit->length;
- it->used_segment = false;
- ram.erase(nit);
- } else if(!pit->used_segment && nit->used_segment) {
- it->length += pit->length;
- it->used_segment = false;
- ram.erase(pit);
- }
- }
- } else if (it == ram.begin()) {
- nit++;
- if (!nit->used_segment)
- it->length += nit->length;
- it->used_segment = false;
- if (!nit->used_segment)
- ram.erase(nit);
- } else if (it == ram.end()) {
- pit--;
- if (!pit->used_segment)
- pit->length += it->length;
- pit->used_segment = false;
- if (!pit->used_segment)
- ram.erase(it);
- }
- q.pop();
- }
- void insert2(int size, int time) {
- bool flag = 0;
- for (list<Segment>::iterator it = ram.begin(); it != ram.end(); ++it) {
- if (it->used_segment == false && it->length >= size) {
- it->start_coordinate += size;
- it->length -= size;
- auto temp = ram.insert(it, Segment(it->start_coordinate - size, time + gl_time, size, true));
- q.push(make_pair(Segment(it->start_coordinate - size, time + gl_time, size, true), temp));
- flag = 1;
- }
- }
- if (!flag) {
- Remove();
- insert2(size, time);
- return ;
- }
- }
- int main() {
- MemoryMenager memory_menager(SIZE);
- int last_added = 0;
- int algo = 0;
- cin >> algo;
- cout << "1 - bestfit\n";
- cout << "2 - firstfit\n";
- vector<pair<int, int> > ans;
- if (algo == 1) {
- for (int index = 0; index < 10; ++index) {
- last_added = memory_menager.AddTask(10 + rand() % 20, 5 + rand() % 10, last_added);
- ans.push_back(make_pair(10 + rand() % 20, 5 + rand() % 10));
- }
- cout << last_added << endl;
- } else {
- initialize();
- ans.push_back(make_pair(6, 10));
- ans.push_back(make_pair(3, 3));
- ans.push_back(make_pair(5, 1));
- for (int index = 0; index < SIZE; ++index) {
- //ans.push_back(make_pair(rand() % SIZE, rand() % SIZE));
- insert2(ans[index].first,ans[index].second);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment