Top.Mail.Ru
Ответы

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

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

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

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

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

Пример
Ввод Вывод
5 1 3 3 3 2
3

По дате
По рейтингу
Аватар пользователя
Ученик

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

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. Вывод результата:
- Выводим количество удаленных оценок.

Этот алгоритм работает эффективно и корректно обрабатывает все предусмотренные случаи.

Аватар пользователя
Ученик
123456789101112131415161718192021222324252627282930313233343536
 #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; 
} 
 
Аватар пользователя
Ученик

zadacha(reshenie(1))
penis(vivesti)



Видео по теме