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