Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

РЕШИТЕ ЗАДАЧУ НА C++

Елизавета Бобырь Ученик (193), открыт 1 неделю назад
На некотором предприятии создали систему оценок отчётов, но произошла ошибка и в системе появились дубликаты оценок. Оценки выстроены в последовательность. Когда образуется непрерывная последовательность одинаковых оценок (3 и более), то она должна быть удалена. При этом оставшиеся оценки сдвигаются друг к другу, и ситуация может повториться.

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

Формат ввода
Сначала вводится количество оценок в последовательности (не более 1000) и далее сами оценки (от 0 до 9).

Формат вывода
Требуется вывести количество оценок, которое будет "стёрто".

Пример
Ввод Вывод
5 1 3 3 3 2
3
2 ответа
Федор Конопля Профи (581) 1 неделю назад
Для решения задачи можно использовать стек, чтобы отслеживать последовательности одинаковых оценок. Алгоритм будет работать следующим образом:

1. Инициализируем стек, который будет хранить пары (оценка, количество повторений).
2. Проходим по массиву оценок:
- Если текущая оценка совпадает с вершиной стека, увеличиваем количество повторений.
- Если текущая оценка не совпадает с вершиной стека, добавляем новую пару в стек.
- Если количество повторений на вершине стека достигает 3, удаляем эту пару из стека и увеличиваем счетчик удаленных оценок.
3. Повторяем процесс, пока не пройдемся по всем оценкам.
4. Выводим количество удаленных оценок.

Вот пример кода на C++:

#include <iostream>
#include <vector>
#include <stack>

using namespace std;

int main() {
int n;
cin >> n;

vector<int> ratings(n);
for (int i = 0; i < n; ++i) {
cin >> ratings[i];
}

stack<pair<int, int>> st;
int deleted = 0;

for (int i = 0; i < n; ++i) {
if (!st.empty() && st.top ().first == ratings[i]) {
st.top ().second++;
} else {
st.push({ratings[i], 1});
}

if ( st.top ().second >= 3) {
deleted += st.top ().second;
st.pop();
}
}

cout << deleted << endl;

return 0;
}


### Объяснение:
1. Ввод данных:
- Считываем количество оценок n.
- Считываем сами оценки в вектор ratings.

2. Инициализация стека и счетчика удаленных оценок:
- Создаем стек st, который будет хранить пары (оценка, количество повторений).
- Инициализируем переменную deleted для подсчета удаленных оценок.

3. Проход по оценкам:
- Для каждой оценки проверяем, совпадает ли она с вершиной стека.
- Если совпадает, увеличиваем количество повторений вершины стека.
- Если не совпадает, добавляем новую пару (оценка, 1) в стек.
- Если количество повторений на вершине стека достигает 3, удаляем эту пару и увеличиваем счетчик удаленных оценок.

4. Вывод результата:
- Выводим количество удаленных оценок.

Этот алгоритм работает эффективно и корректно обрабатывает все предусмотренные случаи.
Федор КонопляПрофи (581) 1 неделю назад
 #include <iostream> 
#include <vector>
#include <stack>

using namespace std;

int main() {
int n;
cin >> n;

vector<int> ratings(n);
for (int i = 0; i < n; ++i) {
cin >> ratings[i];
}

stack<pair<int, int>> st;
int deleted = 0;

for (int i = 0; i < n; ++i) {
if (!st.empty() && st.top().first == ratings[i]) {
st.top().second++;
} else {
st.push({ratings[i], 1});
}

if (st.top().second >= 3) {
deleted += st.top().second;
st.pop();
}
}

cout << deleted << endl;

return 0;
}
Похожие вопросы