Найти четырехугольник наибольшей площади с вершинами в заданных точках - PascalABC.NET

Формулировка задачи:

На плоскости дан набор точек с целочисленными координатами. Необходимо найти четырехугольник наибольшей площади с вершинами в этих точках, две вершины которого лежат на оси Ox, а две оставшиеся - по разные стороны от оси Ox. В первой строке вводиться одно целое число положительное - количество точек N.Каждая из следующих строк содержит два целых числа: сначала координата Х затем координата Y очередной точки. Программа должна вывести одно целое число - максимальную площадь четырехугольника удовлетворяющего условиям задачи. У меня получилось так(можно ли это как-то улучшить? Если не трудно помогите)
program C4;
 
var
  x: array [1..1000] of integer;
  y: array [1..1000] of integer;
  N, i, c, maxx, maxxr, maxxl, maxy, maxy1: integer;
  s: real;
 
begin
  readln(N);
  c := 0;
  for i := 1 to N do
  begin
    read(x[i], y[i]);
  end;
  for i := 1 to N do
  begin
    if y[i] = 0 then
      c := c + 1;
  end;
  if c < 2 then exit;
  if ((maxxr > 0) and (maxxl < 0)) or ((maxxr < 0) and (maxxl > 0)) then begin
    for i := 1 to n do
    begin
      if y[i] = 0 then begin
        if (maxxl > x[i]) then
        begin
          maxxl := x[i];
        end;
      end;
    end;
    maxx := abs(maxxl) + abs(maxxr);
  end;
  if ((maxxr <= 0) and (maxxl <= 0)) or ((maxxr >= 0) and (maxxl >= 0)) then begin
    for i := 1 to n do
    begin
      if y[i] = 0 then begin
        if (maxxr < x[i]) then
        begin
          maxxr := x[i];
        end;
      end;
    end;
    maxx := abs(abs(maxxl) - abs(maxxr));
  end;
  for i := 1 to N do
  begin
    if (maxy < y[i]) then
    begin
      maxy := y[i];
    end;
    if (maxy1 > y[i]) then
    begin
      maxy1 := y[i];
    end;
  end;
  s := 0.5 * maxx * (maxy + abs(maxy1));
  writeln(s);
end.

Код к задаче: «Найти четырехугольник наибольшей площади с вершинами в заданных точках - PascalABC.NET»

textual
const 
  MaxInt = 2147483647;
  MinInt = -2147483648;
 
var
  N, i, x, y, xRight, xLeft, yHigh, yLow: integer;
  s: real;
 
begin
  readln(N);
  xRight := MinInt; xLeft := MaxInt;
  yHigh := MinInt; yLow := MaxInt;
  for i := 1 to N do
  begin
    read(x, y);
    if y = 0 then
    begin
      if xRight < x then
        xRight := x;
      if xLeft > x then
        xLeft := x;
    end
    else
    begin
      if yLow > y then
        yLow := y;
      if yHigh < y then
        yHigh := y;
    end;
  end;
  if (xRight = MinInt) or (xLeft = MaxInt) or (yHigh < 0) or (yLow > 0) then halt(1);
  writeln((xRight - xLeft) * (yHigh - yLow) / 2);
end.

12   голосов, оценка 4.167 из 5


СОХРАНИТЬ ССЫЛКУ