#include #include #include //#include struct Request { Request(int arrival_time, int process_time) : arrival_time(arrival_time), process_time(process_time) { } int arrival_time; int process_time; }; struct Response { Response(bool dropped, int start_time) : dropped(dropped), start_time(start_time) { } bool dropped; int start_time; }; class Buffer { public: Buffer(int capacity) : capacity_(capacity), finish_time_() { } Response Process(const Request &request) { // write your code here if (runningTimeCounter_ < request.arrival_time) { if (finish_time_.size() == 0) runningTimeCounter_ = request.arrival_time; else if (finish_time_.back() < request.arrival_time) runningTimeCounter_ = request.arrival_time; } while (finish_time_.size() > 0) { int j = finish_time_.front(); if (j <= request.arrival_time) finish_time_.pop(); else break; } if (finish_time_.size() >= capacity_) { return Response(true, -1); } Response response = Response(false, runningTimeCounter_); runningTimeCounter_ = runningTimeCounter_ + request.process_time; if (finish_time_.size() > 0) finish_time_.push(finish_time_.back() + request.process_time); else finish_time_.push(runningTimeCounter_); return response; } private: size_t capacity_; std::queue finish_time_; int runningTimeCounter_ = 0; }; std::vector ReadRequests() { std::vector requests; int count; std::cin >> count; for (int i = 0; i < count; ++i) { int arrival_time, process_time; std::cin >> arrival_time >> process_time; requests.push_back(Request(arrival_time, process_time)); } return requests; } std::vector ProcessRequests(const std::vector &requests, Buffer *buffer) { std::vector responses; for (size_t i = 0; i < requests.size(); ++i) responses.push_back(buffer->Process(requests[i])); return responses; } void PrintResponses(const std::vector &responses) { for (size_t i = 0; i < responses.size(); ++i) std::cout << (responses[i].dropped ? -1 : responses[i].start_time) << std::endl; } //TEST(ProcessRequests, t) { // int bufferMaxSize = 1; // Buffer buf = Buffer(bufferMaxSize); // std::vector requests; // std::vector responses = ProcessRequests(requests, &buf); // ASSERT_EQ(0, responses.size()); //} // //TEST(ProcessRequests, t1) { // int bufferMaxSize = 1; // Buffer buf = Buffer(bufferMaxSize); // std::vector requests = {Request(0, 1)}; // std::vector responses = ProcessRequests(requests, &buf); // ASSERT_EQ(1, responses.size()); // ASSERT_EQ(false, responses[0].dropped); //} // //TEST(ProcessRequests, t2) { // int bufferMaxSize = 1; // Buffer buf = Buffer(bufferMaxSize); // std::vector requests = {Request(0, 1), Request(0, 1)}; // std::vector responses = ProcessRequests(requests, &buf); // ASSERT_EQ(2, responses.size()); // ASSERT_EQ(false, responses[0].dropped); // ASSERT_EQ(0, responses[0].start_time); // ASSERT_EQ(true, responses[1].dropped); //} // //TEST(ProcessRequests, t3) { // int bufferMaxSize = 1; // Buffer buf = Buffer(bufferMaxSize); // std::vector requests = {Request(0, 1), Request(1, 1)}; // std::vector responses = ProcessRequests(requests, &buf); // ASSERT_EQ(2, responses.size()); // ASSERT_EQ(false, responses[0].dropped); // ASSERT_EQ(0, responses[0].start_time); // ASSERT_EQ(false, responses[1].dropped); // ASSERT_EQ(1, responses[1].start_time); //} int main() { int size; std::cin >> size; std::vector requests = ReadRequests(); Buffer buffer(size); std::vector responses = ProcessRequests(requests, &buffer); PrintResponses(responses); return 0; }