Подтема 6 из 6 · дополнительный урок
Подсчёт программой
Как посчитать точки программой без рисунка — условием принадлежности и перебором.
Условие принадлежности
Задачу темы можно решить и без рисунка: перебрать целые точки и проверить каждую.
Программа проверяет каждую целую точку условием, записанным по фигурам. Точка лежит в A, если 0 ≤ x ≤ 8 и 0 ≤ y ≤ 6, и в B, если 3 ≤ x ≤ 10 и 2 ≤ y ≤ 7. Для пересечения нужны :
count = 0for x in range(-5, 15): for y in range(-5, 15): in_a = 0 <= x <= 8 and 0 <= y <= 6 in_b = 3 <= x <= 10 and 2 <= y <= 7 if in_a and in_b: count += 1print(count)Точки на линиях учитывают знаки <=; для точек строго внутри берут <. Диапазоны перебора берут с запасом: лишние точки не пройдут условие. Масштаб здесь не нужен — проверяются координаты задачи, а не экрана.
Другие части двух фигур
Другой вопрос о двух фигурах — другое условие в той же программе.
| В условии | Условие |
|---|---|
| в пересечении | in_a and in_b |
| в объединении | in_a or in_b |
| в A, но не в B | in_a and not in_b |
| ровно в одной | in_a != in_b |
count = 0for x in range(-5, 15): for y in range(-5, 15): in_a = 0 <= x <= 8 and 0 <= y <= 6 in_b = 3 <= x <= 10 and 2 <= y <= 7 if in_a or in_b: count += 1print(count)Это те же 63 + 48 − 30 из подтемы 3: программа не складывает фигуры, а проверяет каждую точку один раз, поэтому общие точки не удваиваются.
Треугольник программой
Для наклонных сторон условие берут из уравнений сторон. У треугольника со стороной 8 нижняя сторона лежит на прямой y = x / √3, верхняя — на y = 8 − x / √3. Точка строго внутри, если она между ними и правее оси:
import math count = 0for x in range(1, 8): for y in range(1, 8): low = x / math.sqrt(3) if low < y < 8 - low: count += 1print(count)Получилось то же 24, что и по столбцам в подтеме 5. Столбец x = 7 программа тоже проверила, но в нём нет ни одной точки: там нижняя сторона выше верхней.
Наименьший параметр
Алгоритм «Повтори 2 [Вперёд A Направо 90 Вперёд 6 Направо 90]» из (0; 0) вверх рисует прямоугольник шириной 6 и высотой A. При каком наименьшем натуральном A внутри будет не менее 40 точек? Точки на линиях не учитывать.
Неизвестное в команде перебирают по возрастанию: первое подходящее значение и есть наименьшее.
for A in range(1, 20): count = 0 for x in range(0, 7): for y in range(0, A + 1): if 0 < x < 6 and 0 < y < A: count += 1 if count >= 40: print(A, count) break останавливает перебор на первом подходящем A. Неравенство берут из условия дословно: «не менее 40» — >=, «больше 40» — >. При «больше 40» ответ был бы 10: при A = 9 точек ровно 40.
Наибольшее пересечение
Первая фигура — прямоугольник 0 ≤ x ≤ 8, 0 ≤ y ≤ 6. Вторая — квадрат 7 × 7, его левый нижний угол (p; q) можно поставить в любую целую точку. Сколько наибольшее число целых точек в пересечении вместе с границей?
По каждой оси общая часть не длиннее меньшей из двух сторон. По высоте прямоугольник ниже квадрата: общая часть не длиннее 6. По ширине — не длиннее 7. Значит, точек не больше (7 + 1)(6 + 1) = 56, и это достигается, например, при (p; q) = (1; −1).
Перебор всех положений подтверждает оценку. Границы общей части — те же максимумы и минимумы, что в подтеме 3:
best = 0for p in range(-8, 9): for q in range(-8, 9): left, right = max(0, p), min(8, p + 7) low, high = max(0, q), min(6, q + 7) if left <= right and low <= high: n = (right - left + 1) * (high - low + 1) best = max(best, n)print(best)Итого
- Переборвсе целые точки с запасом, в координатах задачи без k
- Границастрого внутри —
<, с границей —<= - Две фигуры
and,or,and not,!= - Наклонусловие из уравнений сторон
- Параметрперебор по возрастанию, неравенство дословно
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
0 < x < 9 and 0 < y < 4: строго внутри — знаки без равенства.in_a or in_b не считает общие точки дважды?ОтветСкрыть ответ
k?ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Точки прямоугольника программой
Напиши программу, которая считает целочисленные точки строго внутри прямоугольника 0 ≤ x ≤ 9, 0 ≤ y ≤ 4. Сколько их?
Введите число.
Подсказка
Перебери точки с запасом и проверь условие со знаками без равенства.
Решение
Строго внутри — условие 0 < x < 9 and 0 < y < 4. Программа печатает 24, столько же, сколько (9 − 1)(4 − 1).
Решение программой
count = 0for x in range(-1, 11): for y in range(-1, 6): if 0 < x < 9 and 0 < y < 4: count += 1print(count)Ответ: 24
Ровно в одном из прямоугольников
Для прямоугольников A: 0 ≤ x ≤ 8, 0 ≤ y ≤ 6 и B: 3 ≤ x ≤ 10, 2 ≤ y ≤ 7 посчитай программой точки, лежащие ровно в одном из них. Точки на сторонах учитывать.
Введите число.
Подсказка
Точка лежит ровно в одном прямоугольнике, когда принадлежности различаются: in_a != in_b.
Решение
Условие in_a != in_b верно, когда точка лежит в одной фигуре, но не в другой. Программа печатает 51 = 63 + 48 − 2 · 30.
Решение программой
count = 0for x in range(-1, 12): for y in range(-1, 9): in_a = 0 <= x <= 8 and 0 <= y <= 6 in_b = 3 <= x <= 10 and 2 <= y <= 7 if in_a != in_b: count += 1print(count)Ответ: 51
Треугольник программой
Черепаха находится в начале координат, голова направлена вверх. Она выполняет «Повтори 3 [Вперёд 6 Направо 120]». Напиши программу, которая считает целочисленные точки строго внутри получившегося треугольника. Сколько их?
Введите число.
Подсказка
Нижняя сторона лежит на прямой y = x / √3, верхняя — на y = 6 − x / √3.
Решение
Точка строго внутри, если x > 0 и x / √3 < y < 6 − x / √3. Программа печатает 13.
Решение программой
import math count = 0for x in range(-1, 8): for y in range(-1, 8): low = x / math.sqrt(3) if 0 < x and low < y < 6 - low: count += 1print(count)Ответ: 13
Наименьшее A: не менее 30 точек
Черепаха находится в начале координат, голова направлена вверх. Ей дали алгоритм «Повтори 2 [Вперёд A Направо 90 Вперёд 4 Направо 90]», где A — натуральное число. При каком наименьшем A внутри области, ограниченной линией, будет не менее 30 точек с целочисленными координатами? Точки на линии не учитывать.
Введите число.
Подсказка
Строго внутри прямоугольника 4 × A лежит 3(A − 1) точек.
Решение
Нужно 3(A − 1) ≥ 30, то есть A − 1 ≥ 10, A ≥ 11. Проверка: при A = 10 точек 27 — мало, при A = 11 ровно 30.
Ответ: 11
Наименьшее A: больше 60 точек
Черепаха находится в начале координат, голова направлена вверх. Ей дали алгоритм «Повтори 2 [Вперёд A Направо 90 Вперёд 4 Направо 90]», где A — натуральное число. При каком наименьшем A область вместе с линией содержит больше 60 точек с целочисленными координатами?
Введите число.
Подсказка
«Больше» — строгое неравенство: ровно 60 точек не подходит.
Решение
Вместе с границей 5(A + 1) точек. Нужно 5(A + 1) > 60, то есть A + 1 > 12, A ≥ 12. При A = 11 точек ровно 60 — это не больше 60.
Ответ: 12
Квадрат: больше 100 точек внутри
Черепаха находится в начале координат, голова направлена вверх. Ей дали алгоритм «Повтори 2 [Вперёд A Направо 90 Вперёд A Направо 90]», где A — натуральное число. При каком наименьшем A строго внутри будет больше 100 точек с целочисленными координатами?
Введите число.
Подсказка
Строго внутри квадрата A × A лежит (A − 1)² точек; ровно 100 — ещё не больше.
Решение
Нужно (A − 1)² > 100, то есть A − 1 > 10, A ≥ 12. При A = 11 точек ровно 100.
Ответ: 12
Наибольшее пересечение
Первая фигура — прямоугольник 0 ≤ x ≤ 10, 0 ≤ y ≤ 4. Вторую фигуру, квадрат 6 × 6 со сторонами вдоль осей, можно поставить так, чтобы его вершины были в целочисленных точках. Какое наибольшее число точек с целочисленными координатами может оказаться в пересечении фигур, если точки на сторонах учитывать?
Введите число.
Подсказка
По каждой оси общая часть не длиннее меньшей из двух сторон.
Решение
По ширине общая часть не длиннее 6 — это 7 значений x, по высоте не длиннее 4 — 5 значений y. Значит, точек не больше 7 · 5 = 35, и это достигается, например, когда левый нижний угол квадрата в (0; −1).
Ответ: 35