Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
143
Добавлен:
17.03.2016
Размер:
1.14 Mб
Скачать

Var I,X,y,n,h,minx,maxx:integer; s:real;

begin

readln(n);

s:=0; h:=0;

repeat

readln(x,y);

if abs(y)>h then h:=abs(y);

dec(n)

until ((y=0) or (n=0));

if y=0 then begin

minx:=x;

maxx:=x;

for i:=n downto 1 do begin

readln(x,y);

if y = 0 then begin

if x < minx then minx:=x

else

if x > maxx then maxx:=x;

end

else

if (abs(y)>h)then h:=abs(y);

end;

s:=(maxx-minx)*h/2;

end;

writeln(s);

end.

Д.Ф. Муфаззалов предложил также аналогичное решение на языке С++:

#include <math.h>

#include <iostream.h>

Void main()

{

int n, minx, maxx, y,x,h=0;

cin>>n; float s=0;

do {

cin>>x>>y;

if (y!=0)

if (abs(y)>h) h=abs(y);

n--;

}

while (y!=0&&n>0);

if (y==0) {

minx=x;

maxx=x;

for (;n>0;n--) {

cin>>x>>y;

if (y==0)

{

if (x<minx) minx=x;

else

if (x>maxx) maxx=x;

}

else

if (abs(y)>h) h=abs(y);

}

s=(maxx-minx)*h/2.0;

}

cout<<s;

}

  1. Нам нужно определить площадь треугольника, одно из оснований которого лежит на оси ОХ. Пусть длина этого основания равна B, а высота треугольника равна H. Тогда площадь треугольника равна S = BH/2. Важно, что у треугольника нет обеих точек с осью OY, то есть, x-координаты (абсциссы) всех вершин должны быть одного знака, или все положительные, или все отрицательные. Поэтому нужно рассматривать отдельно треугольники, расположенные слева от оси OY (с отрицательными абсциссами), и треугольники, расположенные справа от оси OY (с положительными абсциссами).

Таким образом, эта задача представляет собой как бы «двойную» задачу 46. Так, для левой полуплоскости, нужно найти:

  1. xMin1 – минимальное значение x-координаты среди всех точек, для которых y-координата равна нулю, а x-координата отрицательная;

  2. xMax1 – максимальное значение x-координаты среди всех точек, для которых y-координата равна нулю, а x-координата отрицательная;

  3. yMax1 – максимальный модуль y-координаты среди всех точек, а x-координата отрицательная.

Тогда максимальная площадь S1 = (xMax1xMin1)  yMax1 / 2.

Единственная сложность состоит в том, чтобы записать в переменные xMax1 и xMin1 некоторые начальные значения, которые позволят определить, что еще ни одной точки на отрицательно части оси ОХ не найдено. Можно ввести еще одну логическую переменную (назовём её Found1), которая сначала равна False (ни одна точка на отрицательной части оси ОХ не найдена), и получает значение True, когда такая точка найдена.

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

program Treug;

Var I, n, X, y: integer;

XMin1, xMax1, yMax1: integer;

XMin2, xMax2, yMax2: integer;

Found1, Found2: boolean;

S1, S2: real;

begin

Found1:= False;

Found2:= False;

xMin1 := 0; xMax1 := 0; yMax1 := 0;

xMin2 := 0; xMax2 := 0; yMax2 := 0;

Readln(N);

for i:=1 to N do begin

Readln(x,y);

if x < 0 then begin

if y = 0 then begin

if not Found1 or (x < xMin1) then xMin1:= x;

if not Found1 or (x > xMax1) then xMax1:= x;

Found1:= True;

end

else

if abs(y) > yMax1 then yMax1:= abs(y);

end;

if x > 0 then begin

if y = 0 then begin

if not Found2 or (x < xMin2) then xMin2:= x;

if not Found2 or (x > xMax2) then xMax2:= x;

Found2:= True;

end

else

if abs(y) > yMax2 then yMax2:= abs(y);

end;

end;

S1 := (xMax1 - xMin1) * yMax1 / 2;

S2 := (xMax2 - xMin2) * yMax2 / 2;

if S1 > S2 then

writeln(S1)

else writeln(S2);

end.

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

Type TInfo = record

name: string;

res: integer;

end;

Соседние файлы в папке ЕГЭ 2016-11 класс