Как упростить код?

Как реализовать код а именно нужно создать 2 стека. Один для хранения желудей, другой – для хранения текущей максимальной ценности желудя. Когда белка добавляет новый желудь к первому стеку, мы также добавляем некоторое значение ко второму. Если ценность нового желудя выше текущего максимального значения, то вносится новое значение, если меньше – дублируется предыдущий максимум.
Соответственно, когда белка съедает желудь, мы удаляем верхнее значение как из первого стека, так и со второго. Значение, оставшееся на горе второго стека – текущий максимум, его и выводим.
Входные данные #1:
8
3
2
4
0
4
3
0
0
Исходные данные 1:
3
4
3
#include <iostream>
#include <stack>
using namespace std;

int main() {
    int n, max_quality = 0;
    stack<int> s;
    cin >> n;

    for (int i = 0; i < n; i++) {
        int event;
        cin >> event;

        if (event == 0) {
            // если извлекаем желудь, то выводим максимальное качество
            int top = s.top();
            s.pop();
            if (top == max_quality) {
                // если извлеченный желудь имел максимальное качество,
                // то нужно пересчитать максимальное качество для оставшихся желудей
                max_quality = 0;
                stack<int> tmp;
                while (!s.empty()) {
                    int cur = s.top();
                    s.pop();
                    max_quality = max(max_quality, cur);
                    tmp.push(cur);
                }
                while (!tmp.empty()) {
                    int cur = tmp.top();
                    tmp.pop();
                    s.push(cur);
                }
            }
            cout << max_quality << endl;
        } else {
            // если нашли новый желудь, то добавляем его в стек
            s.push(event);
            max_quality = max(max_quality, event);
        }
    }

    return 0;
}
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
Просто храни в переменной prev_max_quality предыдущее максимальное "качество", которое было перед добавлением в стек последнего желудя

#include <iostream>
#include <stack>
using namespace std;

int main() {
    int n, max_quality = 0, prev_max_quality = 0;
    stack<int> s;
    cin >> n;

    for (int i = 0; i < n; i++) {
        int event;
        cin >> event;

        if (event == 0) {
            // если извлекаем желудь, то выводим максимальное качество
            int top = s.top();
            s.pop();
            if (top == max_quality) {
                max_quality = prev_max_quality;
            }
            cout << max_quality << endl;
        } else {
            // если нашли новый желудь, то добавляем его в стек
            prev_max_quality = max_quality;
            s.push(event);
            max_quality = max(max_quality, event);
        }
    }

    return 0;
}


и, кажется, теперь этот твой стек без надобности, можно без него обойтись
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Ну вот ваше последнее описание и есть решение - храните 2 стека. Вы же храните 1 стек и лишь в определенном случае заводите второй стек tmp.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы