Сломанные сегменты на табло
Условие
В подъезде стоит старое электронное табло с 7 сегментами (как на калькуляторе). Сегменты подписаны буквами a b c d e f g.
Некоторые сегменты сломаны и никогда не загораются. Известно, что сломано ровно k сегментов.
Ты посмотрел на табло в момент, когда на нём была показана одна цифра от 0 до 9, и выписал, какие сегменты горели. Остальные сегменты в этот момент не горели (либо потому что не нужны для этой цифры, либо потому что сломаны).
Нужно понять, сколько разных цифр могли быть показаны.
Набор сегментов для цифр:
0:a b c e f g1:c f2:a c d e g3:a c d f g4:b c d f5:a b d f g6:a b d e f g7:a c f8:a b c d e f g9:a b c d f g
Формат ввода
В первой строке дано целое число k — сколько сегментов сломано. Во второй строке дана строка s — какие сегменты горели при наблюдении. Это строка из разных букв из множества {a,b,c,d,e,f,g} в произвольном порядке. Если не горело ни одного сегмента, то во второй строке стоит один символ -.
Формат вывода
Выведите одно число — сколько цифр от 0 до 9 могут соответствовать наблюдению.
Ограничения
0 ≤ k ≤ 7- во второй строке: либо
-, либо от 1 до 7 разных букв из{a,b,c,d,e,f,g}
Пример
Ввод:
2
cf
Вывод:
3Как решать — идея подхода
Приём: Проверка кандидатов множествами
Ключевое наблюдение: если сегмент горит, он точно не сломан. А если сегмент должен гореть у выбранной цифры, но не горит в наблюдении, то он обязан быть сломан (иначе бы загорелся).
Удобнее работать с множествами букв. Для каждой цифры заранее известен набор сегментов T, которые она пытается зажечь. Наблюдение — это множество seen (если во входе -, то seen = пустое).
Проверка цифры сводится к двум условиям: 1) Нельзя, чтобы горел сегмент, которого у цифры вообще нет: нужно seen ⊆ T. 2) Все «пропавшие» сегменты из T обязаны быть сломаны. Их число need_broken = |T - seen|. Тогда цифра возможна, если need_broken <= k (оставшиеся сломанные сегменты могут быть среди тех, которые эта цифра и так не использует).
План:
- Прочитать
kи строкуs, собратьseen(особый случайs == '-'). - Задать таблицу из 10 множеств
Tдля цифр. - Для каждой цифры:
- если
seenне подмножествоT, пропустить; - посчитать
need_broken = len(T - seen)и сравнить сk. - Посчитать, сколько цифр прошло проверку.
Сложность: перебор 10 цифр, операции над множествами из 7 букв — фактически O(1).
Частая ошибка: забыть, что - означает «ничего не горело», то есть seen должно быть пустым множеством, а не множество из символа '-'.
Разберись руками
Сломано ровно 2 сегмента. В момент наблюдения горели только сегменты: c и f. Остальные сегменты (a, b, d, e, g) не горели — и среди них как раз могут быть сломанные.
- На табло всего 7 сегментов (a..g). Горят 2 (c и f). Сколько сегментов НЕ горело в этот момент?
- Теперь переберём цифры 0–9. Отметь те цифры, у которых В ПРИНЦИПЕ могут гореть оба сегмента c и f (то есть c и f входят в набор сегментов этой цифры).
- Уточняем с учётом «сломано ровно 2». Для каждой из оставшихся цифр посчитай: сколько сегментов ДОЛЖНО было бы гореть у этой цифры, но НЕ горело (значит, они обязаны быть сломанными). Отметь цифры, где таких «обязательных сломанных» не больше 2.
- Сколько цифр получилось в итоге?
Идея: Сначала отбрасываем цифры, у которых среди «их» сегментов вообще нет всех наблюдаемых горящих. Потом для каждой оставшейся цифры считаем, сколько её сегментов обязаны быть сломаны, потому что они должны были гореть, но не горят. Подходят те, где таких обязательных сломанных не больше, чем сказано про поломку.
Решить задачу с автопроверкой на Python →
Куда дальше
- Школьный этап ВсОШ по информатике — как устроен первый этап и план подготовки за четыре недели
- Олимпиада по информатике: с чего начать — два мира олимпиад — ВсОШ и перечневые: этапы, задания и на каком языке писать
- На программиста по олимпиаде: путь по классам — что даёт диплом, куда с ним берут на ИТ-направления и почему решает 9 класс