ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий
Тип задачи: Пары и тройки в числовых данных.
| КЭС: | 3.2 Оценка сложности вычислений. Время работы и объём используемой памяти, их зависимость от размера исходных данных. Оценка асимптотической сложности алгоритмов. Алгоритмы полиномиальной сложности. Переборные алгоритмы. Примеры различных алгоритмов решения одной задачи, которые имеют различную сложность 3.6 Язык программирования (Паскаль, Python, Java, C++, C#). Типы данных: целочисленные, вещественные, символьные, логические. Ветвления. Сложные условия. Циклы с условием. Циклы по переменной. Обработка данных, хранящихся в файлах. Текстовые и двоичные файлы. Файловые переменные (файловые указатели). Чтение из файла. Запись в файл. Разбиение задачи на подзадачи. Подпрограммы (процедуры и функции). Использование стандартной библиотеки языка программирования |
| Тип ответа: | Краткий ответ |
Ответ: 16 105
Решение.
В файле 4413 чисел, каждое записано в отдельной строке. Первое число — элемент последовательности, а не её длина. Рассматриваем только соседние пары, сохраняя исходный порядок. Всего начальных позиций 4413 − 1 = 4412; соседние окна могут пересекаться.
Сначала среди трёхзначных чисел всего файла, оканчивающихся цифрой 5, выбираем наименьшее: m = 105. Отбор задаётся условиями 100 ≤ x < 1000 и остаток при делении на 10 равен 5. Требование окончания 5 не означает кратность 105.
В паре нужен ровно один трёхзначный элемент: два трёхзначных числа не подходят. Дополнительно сумма s должна делиться на m без остатка. Оба условия проверяем одновременно.
Для каждого подходящего окна увеличиваем счётчик на 1 и обновляем минимальную сумму. Перебор идёт по начальным позициям от 1 до 4412 включительно; ни одна допустимая соседняя пара не пропускается и не проверяется дважды.
Сохраним приложенный текстовый файл под именем data.txt рядом с программой. Программа на Python:
with open("data.txt", encoding="utf-8-sig") as f:
a = [int(x) for x in f.read().split()]
m = min(x for x in a if 100 <= x < 1000 and x % 10 == 5)
count = 0
best = None
for i in range(len(a) - 1):
w = a[i:i + 2]
s = sum(w)
if sum(100 <= abs(x) < 1000 for x in w) == 1 and s % m == 0:
count += 1
if best is None or s < best:
best = s
print(count, best)Начальное best = None означает отсутствие найденного окна. Ноль не используется как искусственная начальная граница: реальные суммы могут иметь любой разрешённый условием знак. В данном файле подходящие окна существуют. Данные читаются за линейное время; основной цикл имеет постоянный размер окна, поэтому вся работа занимает O(n), память списка — O(n).
Проверка результата. Полный проход даёт 16 подходящих окон. Минимальная сумма равна 105. Контрольные окна с позициями, отсчитываемыми от 1:
| Начальная позиция | Элементы | Сумма |
|---|---|---|
| 146 | 65; 670 | 735 |
| 214 | 6; 939 | 945 |
| 3583 | 100; 5 | 105 |
Окно с начальной позицией 3583 достигает найденного экстремума. Трёхзначных элементов 1; 105 = 105 · 1. Таблица иллюстрирует результат; полноту количества и экстремума обеспечивает проверка всех начальных позиций, а не только этих примеров.
Ответ: 16 105.
Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINF42698B.
Сообщение увидит только команда сайта: на странице оно не публикуется.
Комментарии к решению
Комментарии видны всем посетителям сайта.
Комментариев пока нет. Будьте первым.
Чтобы оставить комментарий, войдите или зарегистрируйтесь.