ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий
Тип задачи: Самостоятельное написание алгоритма.
Учебные темы: Язык программирования (Паскаль, Python, Java, C++, C#). Типы данных: целочисленные, вещественные, символьные, логические. Ветвления. Сложные условия. Циклы с условием. Циклы по переменной. Обработка данных, хранящихся в файлах. Текстовые и двоичные файлы. Файловые переменные (файловые указатели). Чтение из файла. Запись в файл. Разбиение задачи на подзадачи. Подпрограммы (процедуры и функции). Использование стандартной библиотеки языка программирования; Обработка символьных данных. Встроенные функции языка программирования для обработки символьных строк. Алгоритмы обработки символьных строк: подсчёт количества появлений символа в строке, разбиение строки на слова по пробельным символам, поиск подстроки внутри данной строки, замена найденной подстроки на другую строку. Генерация всех слов в некотором алфавите, удовлетворяющих заданным ограничениям. Преобразование числа в символьную строку и обратно.
| КЭС: | 3.2 Оценка сложности вычислений. Время работы и объём используемой памяти, их зависимость от размера исходных данных. Оценка асимптотической сложности алгоритмов. Алгоритмы полиномиальной сложности. Переборные алгоритмы. Примеры различных алгоритмов решения одной задачи, которые имеют различную сложность 3.3 Определение возможных результатов работы простейших алгоритмов управления исполнителями и вычислительных алгоритмов. Определение исходных данных, при которых алгоритм может дать требуемый результат 3.6 Язык программирования (Паскаль, Python, Java, C++, C#). Типы данных: целочисленные, вещественные, символьные, логические. Ветвления. Сложные условия. Циклы с условием. Циклы по переменной. Обработка данных, хранящихся в файлах. Текстовые и двоичные файлы. Файловые переменные (файловые указатели). Чтение из файла. Запись в файл. Разбиение задачи на подзадачи. Подпрограммы (процедуры и функции). Использование стандартной библиотеки языка программирования 4.1 Анализ данных. Основные задачи анализа данных: прогнозирование, классификация, кластеризация, анализ отклонений. Последовательность решения задач анализа данных: сбор первичных данных, очистка и оценка качества данных, выбор и/или построение модели, преобразование данных, визуализация данных, интерпретация результатов. Программные средства и интернет-сервисы для обработки и представления данных. Большие данные. Машинное обучение 4.2 Анализ данных с помощью электронных таблиц. Вычисление суммы, среднего арифметического, наибольшего (наименьшего) значения диапазона. Вычисление коэффициента корреляции двух рядов данных. Построение столбчатых, линейчатых и круговых диаграмм. Построение графиков функций. Подбор линии тренда, решение задач прогнозирования. Решение задач оптимизации с помощью электронных таблиц 4.3 Дискретизация при математическом моделировании непрерывных процессов. Моделирование движения. Моделирование биологических систем. Математические модели в экономике. Вычислительные эксперименты с моделями. Обработка результатов эксперимента. Метод наименьших квадратов. Оценка числовых параметров моделируемых объектов и процессов. Восстановление зависимостей по результатам эксперимента 4.4 Вероятностные модели. Методы Монте-Карло. Имитационное моделирование. Системы массового обслуживания |
| Тип ответа: | Развернутый ответ |
Ответ: Программа на Python 3 приведена в решении
Решение.
Язык: Python 3. Создаём 26 счётчиков: индекс 0 соответствует a, индекс 1 — b, и так далее до z. Читаем поток по одному символу до первой точки. Для каждой буквы увеличиваем соответствующий счётчик; точку не считаем и саму последовательность не сохраняем.
После чтения count[i] равен числу вхождений соответствующей буквы: изначально все счётчики нулевые, каждое прочитанное вхождение увеличивает ровно свой счётчик на единицу. Это доказывает правильность частот по индукции по длине обработанного префикса.
Для вывода не более 26 раз ищем наибольший положительный счётчик, просматривая индексы от 0 до 25. При равной частоте не меняем выбранный индекс, поскольку используем строгое сравнение. Поэтому среди букв с одной частотой выбирается самая ранняя по алфавиту.
Печатаем выбранную букву без пробела и обнуляем её счётчик. Следующий проход выбирает лучшую среди ещё не выведенных букв. В результате частоты идут по убыванию, равные — по алфавиту, а каждая встречавшаяся буква выводится ровно один раз. Если положительных счётчиков больше нет, завершаем вывод. Пустая последовательность перед точкой даёт пустую строку.
import sys
count = [0] * 26
while True:
char = sys.stdin.read(1)
if char == '.' or char == '':
break
count[ord(char) - ord('a')] += 1
for step in range(26):
best = -1
for i in range(26):
if count[i] > 0 and (best == -1 or count[i] > count[best]):
best = i
if best == -1:
break
print(chr(ord('a') + best), end='')
count[best] = 0
print()Проверка. Для batat. частоты a и t равны 2, частота b равна 1. Первой идёт a, затем t, затем b: ответ atb совпадает с примером. Для zzbaa. частоты a и z равны 2, b равна 1: вывод azb. Для zyx. все частоты равны 1, вывод xyz. Для aaaa. выводится только a.
Пусть L — количество букв до точки. Чтение занимает O(L), выбор порядка — не более 26 · 26 сравнений; итог O(L + 26²), то есть линейное время при фиксированном английском алфавите. Хранятся 26 счётчиков и постоянное число вспомогательных переменных; исходный текст целиком не хранится. Данные читаются именно как поток символов, а не как отдельные строки с буквами.
Ответ: Программа на Python 3 приведена в решении.
Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINFC04179.
Сообщение увидит только команда сайта: на странице оно не публикуется.
Комментарии к решению
Комментарии видны всем посетителям сайта.
Комментариев пока нет. Будьте первым.
Чтобы оставить комментарий, войдите или зарегистрируйтесь.