На плоскости дан набор точек с целочисленными координатами. Необходимо найти четырёхугольник наибольшей площади с вершинами в этих точках, две вершины которого лежат на оси Ox, а две оставшиеся – по разные стороны от оси Ox.
Вам предлагается два задания с похожими условиями: задание А и задание Б. Вы можете решать оба задания или одно из них по своему выбору. Задание Б более сложное, его решение оценивается выше. Итоговая оценка выставляется как максимальная из оценок за задания А и Б.
Задание А. Имеется набор данных, состоящий из 10 пар координат.
Напишите программу для решения такой задачи. В этом варианте задания оценивается только правильность программы, время работы и размер использованной памяти не имеют значения.
Максимальная оценка за правильную программу – 2 балла.
Задание Б. Имеется набор данных, состоящий из пар координат. Пар может быть много.
Напишите программу для решения этой задачи.Постарайтесь сделать программу эффективной по времени и используемой памяти (или хотя бы по одной из этих характеристик).
Программа считается эффективной по времени, если время работы программы пропорционально количеству пар чисел N, т. е. при увеличении N в k раз время работы программы должно увеличиваться не более чем в k раз.
Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа N и не превышает 1 килобайта.
Максимальная оценка за правильную программу, эффективную по времени и памяти, — 4 балла.
Максимальная оценка за правильную программу, эффективную по времени, но неэффективную по памяти, — 3 балла.
Перед текстом программы кратко опишите алгоритм решения задачи и укажите используемый язык программирования и его версию. Описание входных данных.
В первой строке вводится одно целое положительное число — количество точек N. Каждая из следующих N строк содержит два целых числа: сначала координата x, затем координата y очередной точки.
Описание выходных данных.
Программа должна вывести одно число — максимальную площадь четырёхгольника, удовлетворяющего условиям задачи. Если такого четырёхугольника не существует, программа должна вывести ноль.
Пример входных данных:
6
0 0
2 0
0 2
3 -3
5 -5
6 6
Пример выходных данных для приведённого выше примера входных данных:
11
Рассматривайте только четырёхугольники со сторонами лежащими не на оси Ox.
Комментарий.
В оригинальной формулировке задачи последнего условия нет, что создаёт дополнительные трудности при поиске необходимых четырёхугольников.
Искомый четырёхугольник состоит из двух треугольников с общим основанием, лежащим на оси Ox, при этом один треугольник лежит выше этой оси, другой – ниже. Площадь четырёхугольника будет максимальной, если вершины на оси Ox будут расположены как можно дальше друг от друга, а вершины, не лежащие на этой оси, — как можно дальше от неё. Программа читает исходные данные, не запоминая все точки в массиве. Для каждой точки проверяется её принадлежность оси Ox (условие y=0). Среди точек, лежащих на оси, необходимо найти наиболее далеко отстоящие друг от друга – они дадут наибольшее возможное общее основание двух треугольников. Это будут точки с наименьшим и наибольшим значением координаты x. Среди точек, не лежащих на оси Ox, надо найти две точки, расположенные по разные стороны от оси и как можно дальше от неё, — они дадут наибольшие возможные значения высот треугольников. Это будут точки с наибольшим положительным и
наименьшим отрицательным значением координаты y.
Таким образом, задача сводится к нахождению максимального и минимального x среди точек, у которых y=0, максимального и минимального y среди остальных точек и нахождению площади четырёхугольника на основе этих данных.
Перед выводом результата необходимо убедиться в существовании искомого четырёхугольника.
Пример правильной и эффективной программы на языке Паскаль
program c4;
var
n: integer;
x, y: integer;
xmin, xmax: integer;
xsearch: boolean;
ymin, ymax: integer;
i: integer;
s: real;
begin
xsearch := true;
xmin := 0; xmax := 0;
ymin:=0; ymax := 0;
readln(n);
for i:=1 to n do begin
readln(x,y);
if y=0 then begin
if xsearch or (x < xmin) then xmin:=x;
if xsearch or (x > xmax) then xmax:=x;
xsearch:=false;
end
else if y < ymin then ymin:=y
else if y > ymax then ymax:=y
end;
if (xmax>xmin) and (ymin<0) and (ymax>0)
then s := (xmax-xmin)*(ymax-ymin)/2
else s := 0;
writeln(s);
end.
Пример правильной и эффективной программы на языке Бейсик
DIM n AS INTEGER
DIM x, y AS INTEGER
DIM xmin, xmax AS INTEGER
DIM xsearch AS INTEGER
DIM ymin, ymax AS INTEGER
DIM i AS INTEGER
DIM s AS DOUBLE
xsearch = 1
xmin = 0: xmax = 0
ymin = 0: ymax = 0
INPUT n
FOR i = 1 TO n
INPUT x, y
IF y = 0 THEN
IF xsearch = 1 OR x < xmin THEN xmin = x
IF xsearch = 1 OR x > xmax THEN xmax = x
xsearch = 0
ELSEIF y < ymin THEN ymin = y
ELSEIF y > ymax THEN ymax = y
END IF
NEXT i
IF xmax > xmin AND ymin < 0 AND ymax > 0 THEN
s = (xmax - xmin) * (ymax – ymin) / 2
ELSE
s = 0
END IF
PRINT s
Пример правильной и эффективной программы на Алгоритмическом языке
алг c4
нач
цел n
цел x,y
цел xmin=0, xmax=0
лог xsearch=да
цел ymin=0, ymax=0
цел i
вещ s
ввод n
нц для i от 1 до n
ввод x, y
если y=0
то
если xsearch или x xsearch:=нет иначе если y все кц если xmax > xmin и ymin < 0 и ymax > 0 то s:=(xmax-xmin)*(ymax-ymin)/2 иначе s:=0 все вывод s кон Пример решения задачи А на языке Паскаль. coord: array[1..10, 1..2] of integer; {исходные данные} x, y: integer; {координаты очередной точки} xminpos, xmaxpos, yminpos, ymaxpos: integer; {координаты точек четырёхугольника с наибольшей площадью} s: real; {площадь четырёхугольника} i, j: integer; begin xminpos := MaxInt; xmaxpos := -(MaxInt-1); yminpos := MaxInt; ymaxpos := -(MaxInt-1); for i := 1 to 10 do begin read(x, y); coord[i, 1] := x; coord[i, 2] := y; end; for i := 1 to 10 do begin if (coord[i, 2] = 0) and (coord[i, 1] < xminpos) then xminpos := coord[i, 1]; if (coord[i, 2] = 0) and (coord[i, 1] > xmaxpos) then xmaxpos := coord[i, 1]; if (coord[i, 2] <> 0) and (coord[i, 2] < yminpos) then yminpos := coord[i, 2]; if (coord[i, 2] <> 0) and (coord[i, 2] > ymaxpos) then ymaxpos := coord[i, 2]; end; if (xminpos = xmaxpos) or (yminpos = ymaxpos) or (xminpos = MaxInt) then s := 0 else s := (xmaxpos - xminpos)*(ymaxpos-yminpos)/2; writeln(s); end.var

