СДАМ ГИА: РЕШУ ЕГЭ
Образовательный портал для подготовки к экзаменам
Информатика
≡ информатика
сайты - меню - вход - новости




Задания
Версия для печати и копирования в MS Word
Задание 27 № 4868

На плоскости дан набор точек с целочисленными координатами. Необходимо найти такой треугольник наибольшей площади с вершинами в этих точках, у которого нет общих точек с осью Оу, а одна из сторон лежит на оси Ох.

Напишите эффективную, в том числе по памяти, программу, которая будет решать эту задачу. Размер памяти, которую использует Ваша программа, не должен зависеть от количества точек.

Перед текстом программы кратко опишите используемый алгоритм решения задачи и укажите используемый язык программирования и его версию.

 

Описание входных данных

В первой строке вводится одно целое положительное число — количество точек N.

Каждая из следующих N строк содержит два целых числа — сначала координата х, затем координата у очередной точки. Числа разделены пробелом.

 

Описание выходных данных

Программа должна вывести одно число — максимальную площадь треугольника, удовлетворяющего условиям задачи. Если такого треугольника не существует, программа должна вывести ноль.

 

Пример входных данных:

8

-10 0

2 0

0 4

3 3

7 0

5 5

4 0

9 -9

 

Пример выходных данных для приведённого выше примера входных данных:

22 . 5

Решение.

Заметим, что раз искомый треугольник не должен иметь общих точек с осью ОУ, то все его вершины будут одновременно или слева от оси, или справа. Тогда найдём треугольник с максимальной площадью для левой полуплоскости, для правой, а потом выберем лучший из них.

 

Задачи для обеих полуплоскостей решаются аналогично, рассмотрим решение для положительной полуплоскости. Так как две точки будут лежать на оси ОХ, удобнее всего будет считать площадь треугольника по формуле S = a · h / 2, где a — длина основания треугольника, лежащего на оси ОХ, а h — длина перпендикуляра из третьей точки на ось ОХ.

 

Заметим, что если первые две точки лежат на оси ОХ, то третья точка на ней не лежит, иначе бы треугольник получился вырожденный. Значит, множество точек, подходящих на роль первых двух в этом треугольнике, и множество точек, подходящих на роль третьей точки, не имеют общих точек. Из этого следует, что можно независимо найти для треугольника максимальное основание и максимальную высоту и площадь получившегося треугольника будет максимальна.

 

Утверждается, что в таком случае в качестве трёх вершин нужно брать точку с нулевой ординатой и максимальной абсциссой, точку с нулевой ординатой и минимальной абсциссой и точку, максимально удалённую от оси ОХ. Не стоит забывать, что рассматривать необходимо только точки с положительной ординатой. Удобно было бы завести массив и три раза по нему пробежаться, но оптимальнее будет искать точки сразу при считывании.

 

Ниже приведён код решения на языке Pascal версии 2.6.2.

var n, i, x, y, maxPosX, minPosX, maxNegX, minNegX, maxNegAbsY, maxPosAbsY, s : longint;

 

function max(a, b : longint) : longint;

begin

if a > b then max := a else max := b;

end;

 

function min(a, b : longint) : longint;

begin

if a > b then min := b else min := a;

end;

 

begin

readln(n);

for i := 1 to n do

begin

read(x);

readln(y);

if x > 0 then

begin

if y = 0 then

begin

if minPosX = 0 then

minPosX := x;

maxPosX := max(maxPosX, x);

minPosX := min(minPosX, x);

end else

maxPosAbsY := max(maxPosAbsY, abs(y));

end;

if x < 0 then

begin

if y = 0 then

begin

if maxNegX = 0 then

maxNegX := x;

maxNegX := max(maxNegX, x);

minNegX := min(minNegX, x);

end else

maxNegAbsY := max(maxNegAbsY, abs(y));

end;

end;

s := max((maxPosX - minPosX) * maxPosAbsY, (maxNegX - minNegX) * maxNegAbsY);

write(s / 2 :1:1);

end.