При помощи очереди с нахождением максимума за O(1) надо обрабатывать миллиарды элементов. Чтобы программа работала быстрее, нужно придать фиксированный размер двум стекам, при помощи которых моделируется очередь. Как это сделать правильно? Мои попытки:
AmpQueue(int size){
std::vector< std::pair
А вот и сама программа:
#include
// Класс для эффективного нахождения максимальной
// амплитуды на подотрезке
class AmpQueue{
private:
std::stack< std::pair
int main(){
int n, current, maximum, element;
std::cin.sync_with_stdio(false);
std::cin >> n;
AmpQueue q(n);
// Загрузим в очередь первые n значение амплитуды
q.load(n);
// Выведем текущий максимум
std::cout << q.max() << std::endl;
// Загружаем следующий элемент последовательности и ищем максимум
std::cin >> current;
while(current != -1){
q.pop();
q.push(current);
std::cout << q.max() << std::endl;
std::cin >> current;
}
}
Программа сначала крашилась при запуске, а после исправлений стала выдавать одни и те же числа. Возможно, этот код совсем плохой, потому что вчера я редактировал его уже только на идеоне. Поэтому показываю код на идеоне:
https://ideone.com/bJUpwL
Предполагаю, что проблема в том, что два стека уже заполнены нулевыми парами и имеют размер n, поэтому при добавлении новых элементов они укладываются сверху на существующие нулевые элемента. Из-за этого алгоритм работает неправильно (точнее, из-за условия empty).
Как все исправить?
Ответ
Попробуйте использовать std::vector::reserve() вместо std::vector::resize(). Но в push() вам нужно контроллировать верхний размер в любом случае.
Ваш поправленный пример, не могу оценить насколько он работающий: https://ideone.com/uF09OU
Комментариев нет:
Отправить комментарий