На числовой прямой даны три отрезка: P = [153 697; 780 411], Q = [275 071; 904 082], R = [722 050; 984 086].
Укажите наименьшую возможную длину такого отрезка A, для которого логическое выражение
(¬(x ∈ A)) → (((x ∈ P) ≡ (x ∈ Q)) → ((x ∈ R) ≡ (x ∈ Q))).
истинно (т. е. принимает значение 1) при любом значении переменной x.
Введем обозначения:
Применив преобразование импликации, получаем:
Логическое ИЛИ истинно, если истинно хотя бы одно утверждение. Необходимо найти такой промежуток А, где выражение
((P ≡ Q) →(R ≡ Q)) ложно. Импликация ложно только в одном случае, когда первое высказывание истина. а второе высказывание ложно.
Выражение (P ≡ Q) истинно на множестве (−∞, 153 697] ∪ [275 071, 780 411] ∪ [ 904 082, +∞).
Выражение (R ≡ Q) ложно на множестве [275 071, 722 050] ∪ [ 904 082, 984 086].
Выражение ((P ≡ Q) →(R ≡ Q)) ложно на множестве [275 071, 722 050] ∪ [ 904 082, 984 086]. Следовательно, А должно быть истинно на этом промежутке. Тогда минимальная длинна А равна 984 086-275 071=709015.
Ответ: 709015.
Приведём решение Егора Чернецова на языке Python.
P=153697,780411;Q=275071,904082;R=722050,984086
def f(x):return ((P[0]<=x<=P[1])==(Q[0]<=x<=Q[1]))<=((R[0]<=x<=R[1])==(Q[0]<=x<=Q[1]))
bad=[x for x in range(P[0],R[1]+1) if not f(x)]
print(max(bad)-min(bad))
Приведём решение Данила Лукиных на языке Python.
Закодируем границы диапазонов так, чтобы максимально сузить круг перебираемых значений, следуя следующим правилам:
1) Если между двумя соседними границами диапазонов не было целочисленных точек, то и в закодированном виде между числами не должно быть точек
1.1) Иначе, если точка была одна, то аналогично одна точка должна быть и между закодированными границами
1.2) Иначе, если точек было 2 и более, нужно оставить 2 точки между закодированными границами.
Проведём кодировку, для этого расположим границы в порядке возрастания и подберём для них значения, в соответствие с правилами:
153 697 - 1
275 071 - 4
722 050 - 7
780 411 - 10
904 082 - 13
984 086 - 16
Так как между всеми границами было более 2-х точек, в закодированном виде между числами мы также оставили по 2 точки.
Теперь напишем программу для перебора всех возможных значений промежутка A в диапазонах от -1 до 18(включительно), а для x, в свою очередь от -2 до 19(включительно).
a1_res = 0
a2_res = 0
min_len = -1
for a1 in range(-1, 19):
for a2 in range(a1, 19):
flag = True
for x in range(-2, 20):
flag = (not (a1 <= x <= a2)) <= (((1 <= x <= 10) == (4 <= x <= 13)) <= ((7 <= x <= 16) == (4 <= x <= 13)))
if not flag:
break
if flag and (a2 - a1 < min_len or min_len == -1):
a1_res = a1
a2_res = a2
min_len = a2 - a1
print(a1_res, a2_res)
Программа выдала два значения: 4 и 16. Переведём коды обратно в значения границ и вычислим полученную длину промежутка A.
984 086 - 275 071 = 709 015

