Статья Автор: Лебедев Дмитрий

(КЕГЭ27-2021) Разбор задания F27-01 (Задания от Фомы)

Разберем задание F27-01,  которое было создано по мотивам задания типа 27 КЕГЭ 2021 года.  
Разбор будет проведен для решения на языке PYTHON  и будет состоять из трех частей:
  • Ввод/чтение данных
  • Переборное решение (для "файла А")
  • Оптимизация и поиск эффективного решения (для "файла В")
В процессе просмотра полезно открыть условие задания F27-01 и запускать промежуточные коды.
 

ВВОД/ЧТЕНИЕ ДАННЫХ
Это общий этап  для "переборного" и "эффективного" решений  и мало зависит от "основного" условия задания.
Правильная организация этого этапа позволяет избежать ошибок и "не усложнять" решение
Будем формировать решение, в котором все данные считываются и храняться в оперативной памяти компьютера
(в заданиях КЕГЭ это допустимо и можно считать "обязательным" при решении)
После этого этапа доступ к файлу больше не нужен, а данные должны храниться в соответствующем формате
В таблице приведено несколько решений для этого этапа (все решения взяты из ученической практики)
Код Комментарий
Пример 1 f=open('name.txt")
n=int(f.readline())
m=int(f.readline())
v=f.readlines()
1. Список v содержит данные в строковом формате, значит потребуется  дополнительное преобразование типов
2. Количество строк в списке v может отличаться от n 
Пример 2 a = []
with open('name.txt') as file:
    a = [int(num) for num in file.readlines()]
n,m = a[:2]
a = a[2:]
1. Количество строк в списке v может отличаться от n
2. Придется менять конструкцию ввода, если в строке с данными по два числа 
Пример 3 with open(name.txt', 'r', encoding='utf-8') as file:
    n = int(file.readline().strip())
    m = int(file.readline().strip())
    data = [int(j) for j in [i.strip() for i in file.readlines()] if j != '']
1. Использование "лишних" параметров влияет на время ввода кода (увеличивает "временные" затраты пользователя)
 2. Количество строк в списке v может отличаться от n 
   Коды из всех примеров позволят получить получить "верные" ответы, но можно ли назвать их "правильными"?
При организации ВВОДА будем придерживаться следующих принципов:
  • файл из задания сохраняется в "рабочей папке" (для большинства случаев это - "правая кнопка мыши на ссылке - сохранить ссылку как")
  • имя файла не изменятся без острой необходимости
  • текс программы также сохраняется в "рабочей папке"
  • параметры "по умолчанию"  опускаются
  • для ввода однотипных слов/строк используем технологию "copy-paste" (поэтому длина слова f.readline() не страшна devil)
Для файла из вложения, можем получить следующий код программы (комментария для иллюстрации команд - на экзамене не нужны)


Возможны и другие реализации. Например, с популярными  with и append


Создаем "ПЕРЕБОРНОЕ" решение.
Этап ВВОДА пройден, данные записаны в переменные n.m и список A (поскольку решение пишется для экзамена и оно "одноразовое", то сознательно откажемся от "говорящих имен", но списки будем обозначать прописными буквами, а переменные строчными).
"Переборное" решение должно пройти все этапы задания (решая каждый "переборным" методом). 
Выделим эти этапы:
  1. Нахождение всех пар (i,j) для которых \(S_i^j\) кратна m  : - определение значения w
  2. Нахождение максимального значения \(S_i^j\) и отбор пар принимающих такое значение: - определение значений x, y
  3. Определение z ( определение минимального значения левого индекса)
Нетрудно увидеть, что нахождения требуемых значений можно обойтись без хранинения найденных пар.
Если Вам это понятно, то можете сразу перейти к второй части разбора
Для выполнения этапов постараемся использовать минимум "фишек" языка Python, но для храниния пар воспользуемся словарями.


Вычисление максимального значения для \(S_i^j\) логично добавить к этапу А 
(для удобства чтения старые комментарии уберем)


Теперь можно перейти к определению y и z. Отметим, что для "итоговых" переменных (w, x, y, z)  использовались "короткие" имена из формулировки задания, а это не совсем "хорошо". В новом решении будем испрользовать "говорящие" www, xxx, yyy, zzz
(старые комментарии снова уберем)


В решении есть две логические ошибки (допущенные сознательно), которые "легко находятся"
при запуске задания на файле из примера ( 'F27-01_000.txt') 
Найдите и исправьте их (для этого измените имя файла и сравните ответы)
Проверьте свою "догадку" на странице задание F27-01 


Проверка программы на тесте из условия - ОБЯЗАТЕЛЬНЫЙ этап решения
Дальнейший разбор задания с оптимизацией решения можно посмотреть здесь
Прикрепленные файлы
F27-01_000.txt
F27-01_001.txt
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать