Jiopik Ответов: 3

Проблема очереди с ограничением времени, окнами и билетами.


У меня возникли трудности с прохождением ошибки ограничения времени реализации следующей задачи Задача: - 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;
}

3 Ответов

Рейтинг:
2

Patrice T

Цитата:
нам сказали использовать очередь, основанную на связанных списках, с массивом. Никакой кучи или какой-либо другой структуры. Я нахожу, что при реализации связанного списка добавление каждого элемента довольно дорого, так как каждый раз происходит новое распределение.

Это предложение показывает, что вы не читали требование всерьез. В таких проблемах каждое слово имеет значение.
Вам говорят использовать массив, потому что он избегает необходимости выделять/освобождать память каждый раз.
Тогда вы неправильно поняли значение очереди в естественном языке и в компьютерном программировании. Очередь людей-это не та очередь, которую вы должны обрабатывать в программе, потому что каждый человек появляется 1 раз.
Очередь предназначена для обработки доступности окон.

Боюсь, вам придется пересмотреть свой кодекс.


Рейтинг:
2

Richard MacCutchan

Это тот же самый вопрос, который вы опубликовали на сайте очереди, чтобы найти минимальное время, чтобы обслужить всех. - Дискуссионные доски C / C++ / MFC[^]. Если у вас есть реальный вопрос, то, пожалуйста, покажите код, который у вас есть, и объясните точно, в чем заключается проблема.


Jiopik

http://cpp.sh/93ulj это и есть код.

Richard MacCutchan

Если вы не можете потрудиться показать все детали в своем вопросе, то вряд ли кто-то здесь сможет помочь.

Jiopik

Проблема заключается в ошибке ограничения по времени!

Richard MacCutchan

Затем вам нужно заставить ваш код работать быстрее.

Jiopik

Я не вижу, что я могу сделать?

Richard MacCutchan

Я тоже не могу, потому что вы до сих пор не дали нам четкого объяснения, в чем заключается проблема и где она возникает в вашем коде.

Рейтинг:
0

OriginalGriff

Начните с просмотра вашего кода и выяснения того, что занимает время, используя любые средства синхронизации, которые позволяет ваша среда разработки / отладчик. Мы понятия не имеем, что делает ваш код, поэтому мы вообще не можем помочь с этим, и мы не могли бы запустить ваш код против ваших данных в любом случае, и это то, что вам нужно, чтобы начать работать над тем, что замедляет вас.

Но учитывая, что вы должны использовать массив, а не кучу в качестве "резервного хранилища", ваше "выделение" нового элемента должно быть тривиальным с точки зрения времени.

Я бы, вероятно, сделал это так: установил каждый элемент вашего массива как "свободный узел" и построил связанный список всего массива как "свободный список". Чтобы добавить новый новый элемент в свою очередь, возьмите первый свободный элемент, удалите его из списка свободных элементов и добавьте в хвост очереди. Когда вы снимаете очередь, добавьте ее обратно в список бесплатных. Это тривиальное количество изменений указателя, так что это не займет много времени...