СВЕТ: СПАСИБО
01-12-2023
Читать статью
Калужский Александр: Задача про Цаплю: https://www.youtube.co..
24-11-2023
Сергей: спасибо большое
Привет! Сегодня посмотрим задачи на отрезки из 15 задания ЕГЭ по информатике.
Решим с помощью шаблона на Python и помощью рассуждений. Повторите основные логические операции в этой статье.
Покажу Вам уникальный и понятный способ для борьбы с задачами на отрезки из 15 задания ЕГЭ по информатике.
Приступим к тренировочным задачам на отрезки.
На числовой прямой даны два отрезка B=[10; 15] и С=[20; 27]. Укажите наименьшую возможную длину такого отрезка A, для которого логическое выражение
ложно (т.е. принимает значение 0) при любом значении переменной x.
Решение с помощью шаблона на языке Python.
Приведу собственную разработку, как можно решить задачи на отрезки из 15 задания ЕГЭ по информатике с помощью шаблона на языке Python (Питон).
def F(a, b, x): if a <= x <= b: return True else: return False mn=10**9 for a in range(0, 100): for b in range(a, 100): k=0 for i in range(1, 200): x = i/2 if not( (F(10, 15, x) or F(20, 27, x)) ) or F(a, b, x): k=k+1 if k==199: mn=min(mn, b-a) print(mn)
Здесь заводим функцию F(a, b, x). Она принимает три параметра: начало отрезка a, конец отрезка b и точку x. Если точка x лежит в отрезке [a;b], то функция вернёт True, иначе False.
Затем делаем два вложенных цикла. Это поиск отрезка A. Переменная a - это начало отрезка A. Переменная b - это конец отрезка A. Для каждой точки a пробуем различные точки b, которые находится правее, чем точка a. Мы начинаем проходить переменной b со значения a, потому что в некоторых задачах длина искомого отрезка A может быть равна нулю.
Для каждого отрезка-кандидата заводим счётчик k. Прокручиваем переменную i в диапазоне от 1 до 199 включительно. А x будет крутится от 0.5 до 99.5 с шагом 0.5, тем самым имитируя фразу при любых значениях x.
Внутри "цикла i" проверяем логическое выражение. Если выражение удовлетворяет условию задачи, то прибавляем к счётчику k единицу для данного отрезка A=[a; b].
При составлении логического выражения может помочь табличка.
После окончания "цикла i" проверяем счёт k. Если логическое выражение сработало при всех значениях x, то в счётчике будет число 199. Это количество итераций в "цикле i". Если такое выполняется, то нам подходит этот отрезок A.
Среди всех отрезков A, которые удовлетворяют условию задачи, выбираем с наименьшей длиной с помощью функции min.
Примечание: У нас всегда получается отрезок A c квадратными скобками на концах A=[a, b]. Даже, если в задачке должен быть отрезок с выколотыми точками, то на длину это никак не влияет, если мы ищем минимальный отрезок, поэтому всё равно будет получатся правильный ответ. Если же мы ищем наибольшую длину, нужно получать всегда отрезок A=(a,b) c выколотыми точками. Об этот речь пойдёт ниже.
Получается 17.
Решение с помощью рассуждений.
Видим, что ко всему выражению применяется логическое отрицание. Мы можем убрать это отрицание, но тогда нужно будет сделать, чтобы выражение было истинным, а не ложным.
В подобных задачах идём от обратного. Нам нужно найти, когда выражение будет истинным, но мы исследуем случай, когда выражение будет стремится ко лжи.
Найдём, при каких значениях x левое выражение будет выдавать 1.
Здесь заштрихованы те иксы, которые приводят к тому, что левое выражение выдаёт 1. Это опасные x. Они "приближают" всё выражение к нулю.
Наша задача этого не допустить. У нас есть только один инструмент: подобрать такой отрезок A, чтобы правое выражение при опасных иксах выдавало 1. Тогда мы получим желаемый результат.
Т.е. при опасных иксах правое выражение должно выдавать 1. Чтобы покрыть все иксы приходится брать отрезок A=[10, 27].
В ответе напишем длину отрезка A: 27 - 10 = 17. Здесь достаточно из наибольшей точки отнять наименьшую.
На числовой прямой даны два отрезка: B = [14; 20] и С = [15; 27]. Укажите наименьшую возможную длину такого отрезка A, для которого логическое выражение
истинно (т.е. принимает значение 1) при любом значении переменной x.
def F(a, b, x): if a <= x <= b: return True else: return False mn=10**9 for a in range(0, 100): for b in range(a, 100): k=0 for i in range(1, 200): x=i/2 if F(a, b, x) or (F(14, 20, x) == F(15, 27, x)): k=k+1 if k==199: mn=min(mn, b-a) print(mn)
Получается ответ 13.
"Главной скрипкой" логического выражение является следование. Именно эта операция соединяет большие блоки логического выражения.
Нас будет интересовать тот случай, когда логическое выражение, наоборот, будет стремится к 0. Тогда правое логическое подвыражение должно равняться 0, а с помощью левого подвыражения, где находится отрезок A, мы будем исправлять ситуацию.
Заштрихуем те значения x, при которых правое подвыражение даёт ноль. Равносильность даёт ноль, когда два выражения имеют разные значения. Т.е. если x находится в одном отрезке, то в другом отрезке его не должно быть.
В подобных задачах можно не обращать внимание на закрашенные и выколотые точки на концах отрезков, потому что в дальнейшем нужно найти длину отрезка A, а длина от этого не зависит. Поэтому пишем и рисуем отрезки с некоторым приближением до одной точки.
Получаются два отрезка [14; 15) и (20; 27]. Это и есть "опасные" значения x. При этих значениях выражение уже "наполовину" ложно. Но с помощью A мы не дадим превратится ему в 0 при любых иксах.
Если левое подвыражение будет равно 1 при опасных значениях икс, то как раз получится то, что нам не нужно. Поэтому при опасных значениях иск, в левом выражении должен быть ноль.
Т.к. там стоит отрицание, убрав его, можно сказать, что в левом подвыражении должна стоять 1 при опасных значениях икс.
Чтобы покрыть все два отрезка опасных значений, выбираем A=[14; 27]. Нас просили найти минимальный отрезок A. Меньше не можем взять, т.к. тогда не все заштрихованные иксы будут закрыты.
Длина получается 27 - 14 = 13.
На числовой прямой даны два отрезка: P = [43; 49] и Q = [44; 53]. Укажите наибольшую возможную длину такого отрезка A, что формула
тождественно истинна, то есть принимает значение 1 при любых x.
def F(a, b, x): if a <= x <= b: return True else: return False def F2(a, b, x): if a < x < b: return True else: return False mx=0 for a in range(0, 100): for b in range(a, 100): k=0 for i in range(1, 200): x=i/2 if (not(F2(a, b, x)) or F(43, 49, x)) or F(44, 53, x): k=k+1 if k==199: mx=max(mx, b-a) print(mx)
Ответ получается 10. Здесь ищем максимальный отрезок A. При поиске отрезка максимальной длины, нужно создать функцию F2, и её применять к отрезку A, чтобы получался всегда отрезок с выколотыми точками A=(a, b).
Главная скрипка - это логическое или. Эта логическая операция соединяет два больших выражения.
Идём от обратного. Исследуем, когда выражение будет стремится к 0.
Логическое или выдаёт ноль, когда оба выражения равны нулю.
В начале лучше разобраться с тем выражением, где нет отрезка A. Это правое подвыражение. Там должен получаться ноль. Заштрихуем те иксы, которые выдают в правом подвыражении ноль.
В левом выражение стоит следование. Эта операция равна нулю, когда из 1 следует 0. С помощью отрезка A мы будем спасать ситуацию. Заштрихуем, когда икс НЕ принадлежит P. Добавим это действие к предыдущей штриховке.
Таким образом, мы получили опасные иксы. Это все иксы, кроме отрезка [43; 53].
Именно при этих иксах выражение (x ∈ A) не должно выдавать 1. Выбираем отрезок A=[43; 53].
Мы могли бы взять отрезок и меньше, например [44; 49], но нас просили взять наибольший отрезок.
Длина равна 53 - 43 = 10.
На числовой прямой даны три интервала: P=[10,15], Q=[5,20] и R=(15,25]. Определите наименьшую возможную длину отрезка A, при выборе которого выражение
будет ложно при любых x.
def F(a, b, x): if a <= x <= b: return True else: return False def F2(a, b, x): if a < x <= b: return True else: return False mn=10**9 for a in range(0, 100): for b in range(a, 100): k=0 for i in range(1, 200): x = i / 2 if not( (F(a, b, x) or F(10, 15, x)) == (not(F(5, 20, x)) or F2(15, 25, x)) ): k=k+1 if k==199: mn=min(mn, b-a) print(mn)
Здесь заводим ещё одну функцию F2 для отрезка R с выколотой левой точкой. Ответ получается 5.
Нужна ложь, но мы рассмотрим, когда равносильность выдаёт 1.
1) Рассмотрим первый случай 1 ≡ 1.
Рассмотрим левое выражение. Узнаём, когда оно выдаёт ноль, а потом сделаем инверсию, чтобы не рассматривать 3 случая.
Получается, что в отрезке Q иксы должны находится, а в R нет.
Сделаем инверсию.
Получается интервал x ∈ (-∞ 5) U (15; ∞). Это те иксы, при которых в правом выражении будет 1.
Рассмотрим, когда левое выражение выдаёт 1.
a) 0 → 0
Учитывая вышеописанный интервал, понимаем, что иксы и так не лежат в отрезке P. Чтобы спаси ситуацию, нужно, чтобы выражение (x ∉ A) выдавало 1, при x ∈ (-∞ 5) U (15; ∞). Тогда левое выражение будет выдавать 0, а правое 1.
Следовательно, можем выбрать любой отрезок A в интервале [5; 15].
б) 0 → 1
При x ∈ (-∞ 5) U (15; ∞) выражение (x ∈ P) никогда не выдаст 1. Значит, в этом варианте 1 ≡ 1 никогда не будет.
в) 1 → 1
Аналогично невозможна и эта ситуация.
Перейдём ко второму случаю.
2) Рассмотрим случай 0 ≡ 0.
Когда правое выражение выдаёт ноль, мы уже смотрели. Это отрезок [5; 15].
Изучим те значения x, при которых левое выражение тоже будет выдавать 0 на отрезке [5; 15].
Тогда опасные иксы будут выглядеть следующим образом:
Т.е. это интервал [5; 15], но без отрезка P. Именно при x ∈ [5; 10) мы должны получать 0 в выражении (x ∉ A), чтобы спасти ситуацию. Получается A=[5;10). Меньше взять отрезок не можем, иначе не все опасные иксы будут покрыты.
Этот отрезок хорошо соотносится с первым вариантом 1) 1 ≡ 1.
Ответ получается 10 - 5 = 5.
На числовой прямой даны два отрезка: D = [17; 58] и C = [29; 80]. Укажите наименьшую возможную длину такого отрезка A, для которого логическое выражение.
истинно (т.е. принимает значение 1) при любом значении переменной х.
def F(a, b, x): if a <= x <= b: return True else: return False mn=10**9 for a in range(0, 100): for b in range(a, 100): k=0 for i in range(1, 200): x = i / 2 if not(F(17, 58, x)) or (not((not(F(29, 80, x)) and not(F(a, b, x)))) or not(F(17, 58, x))): k=k+1 if k==199: mn=min(mn, b-a) print(mn)
"Главной скрипкой" данного логического выражения является следование, потому что эта операция соединяет различные логические блоки.
Нам нельзя допустить, чтобы первое выражение принимало 1, а второе 0, одновременно.
Рассмотрим при каких значениях x реализуется этот страшный вариант.
Видно, что, если левое выражение (x ∈ D) равно 1, то ¬(x ∈ D) в правой части автоматически выдаёт 0.
Чтобы умножение в правой части давало 1, необходимо, чтобы выражение ¬(x ∈ C) было истинным.
Тогда опасные значения - это отрезок D без отрезка C. Т.е., чтобы иксы были в отрезке D, но не были в отрезке С одновременно.
Опасные значения получаются [17; 29]. Чтобы опасный сценарий нейтрализовать, выражение ¬(x ∈ A) должно принимать значение 0. Тогда (x ∈ A) должно выдавать 1. Чтобы это происходило всегда при опасных значениях, принимаем A=[17, 29]. Длина получается 12.