Проблема очереди с ограничением времени, окнами и билетами.
У меня возникли трудности с прохождением ошибки ограничения времени реализации следующей задачи Задача: - Google Docs[^]
Кстати, наше определение очереди требуется, поскольку мы изучаем структуры данных, и нам сказали использовать очередь, основанную на связанных списках, с массивом. Никакой кучи или какой-либо другой структуры. Я нахожу, что при реализации связанного списка добавление каждого элемента довольно дорого, так как каждый раз происходит новое распределение.
Чем вы можете помочь?
Что я уже пробовал:
Реализация:
#define _CRT_SECURE_NO_WARNINGS #include <iostream> //#include <cmath> #include <climits> //#include <string> #include <algorithm> #include <stdexcept> using namespace std; struct Queue { void enqueue(int value); int dequeue(); bool empty(); private: struct Node { int value; Node* next; Node(int value) : value(value), next(nullptr) {}; }; Node* head = nullptr; Node* tail = nullptr; }; void Queue::enqueue(int value) { Node* tmp = new Node(value); if (head) { tail = tail->next = tmp; } else { head = tail = tmp; } } bool Queue::empty() { return head == nullptr; } int Queue::dequeue() { if (!head) { throw out_of_range("queue empty"); } int value = head->value; Node* tmp = head; head = head->next; delete tmp; return value; } int main() { freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); struct Queue queue; int n, k, temp, entry; long long int res = 0, mins; cin >> n >> k; //end times stored when each window has finished a client. //When done processing all clients, the end times for every window //are stored for their respective last clients. long long int *a = new long long int[min(k, n)]; for (int i = 0; i < min(k, n); i++) { cin >> a[i]; res = max(a[i], res); } for (int i = k; i < n; i++) { cin >> entry; queue.enqueue(entry); } int min_Index = 0; while (!queue.empty()) { mins = LLONG_MAX; for (int j = 0; j < k; j++) { if (a[j] < mins) { mins = a[j]; min_Index = j; } } //minimum time = maximum of end times - (the beginning time = 0). temp = queue.dequeue(); a[min_Index] += temp; if (a[min_Index] > res) res = a[min_Index]; } cout << res; return 0; }