Двойная площадь треугольника на школьной карте
Условие
На школьной карте отметили три места: вход в школу A, спортзал B и столовую C. Завуч попросил посчитать «площадь» треугольника ABC, но чтобы не возиться с дробями, просит вывести удвоенную площадь (то есть величину, равную площади, умноженной на 2).
Координаты целые, могут быть большими: в других языках может понадобиться 64-битный тип (как на олимпиадах), потому что промежуточные значения не обязаны помещаться в 32 бита.
Формат ввода
В одной строке 6 целых чисел: x1 y1 x2 y2 x3 y3 — координаты точек A(x1, y1), B(x2, y2), C(x3, y3).
Формат вывода
Выведите одно целое число — удвоенную площадь треугольника ABC.
Ограничения
-100000 ≤ xi, yi ≤ 100000- Координаты — целые числа.
Пример
Ввод:
0 0 1 0 0 1
Вывод:
1Как решать — идея подхода
Приём: Векторное произведение (ориентированная площадь)
Заметь: «удвоенная площадь» треугольника на координатной плоскости удобно считается без дробей через ориентированную площадь. Если взять два вектора из одной вершины, например AB = (x2-x1, y2-y1) и AC = (x3-x1, y3-y1), то их псевдоскалярное (в 2D) векторное произведение AB x AC = (x2-x1)*(y3-y1) - (y2-y1)*(x3-x1) даёт площадь параллелограмма со сторонами AB и AC со знаком. А площадь треугольника — в 2 раза меньше, значит удвоенная площадь треугольника как раз равна abs(AB x AC).
Почему работает: формула — это частный случай «шнуровки»/детерминанта 2x2; знак показывает ориентацию (по часовой/против), а модуль убирает знак.
План:
- Считай
x1 y1 x2 y2 x3 y3. - Посчитай компоненты векторов
ABиACкак разности координат. - Найди
cross = ABx*ACy - ABy*ACx. - Ответ:
abs(cross).
Сложность: O(1) по времени и памяти.
Частая ошибка: забыть abs(...) (тогда получится отрицательное число при «обратном» обходе точек) или перепутать порядок вычитания в формуле (знак меняется). Также в некоторых языках нужен 64-битный тип, потому что произведения могут быть большими.
Разберись руками
Точки на карте: A(0,0) — вход, B(1,0) — спортзал, C(0,1) — столовая. Надо вывести удвоенную площадь треугольника ABC, чтобы не появлялись дроби.
- Смотри на движения от A: до B — на 1 вправо, до C — на 1 вверх. Параллелограмм на этих двух «стрелках» — это просто квадрат 1×1. Отметь клетки, которые занимает этот параллелограмм (сетка тут ровно 1×1).
- Сколько единичных клеток получилось в отмеченном параллелограмме? (Это его площадь в «клетках».)
- Теперь главное наблюдение: треугольник ABC — это ровно половина такого параллелограмма (если взять те же две «стрелки» из A). Значит его удвоенная площадь равна площади параллелограмма. Какое число надо вывести?
Идея: Сдвинь мыслью одну вершину в точку A и посмотри на два шага из A к двум другим точкам. Построй параллелограмм на этих двух шагах: его площадь считается целым числом, без половинок. У треугольника удвоенная площадь ровно равна площади этого параллелограмма; если получилось отрицательно из-за направления, берут по модулю.
Решить задачу с автопроверкой на Python →
Куда дальше
- Школьный этап ВсОШ по информатике — как устроен первый этап и план подготовки за четыре недели
- На программиста по олимпиаде: путь по классам — что даёт диплом, куда с ним берут на ИТ-направления и почему решает 9 класс
- Вердикты судьи: WA, TLE, RE, PE, CE — что значит каждый код проверяющей системы и где искать причину