Задания
Версия для печати и копирования в MS Word
Тип Д27 C4 № 4862
i

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

 

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

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

 

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

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

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

 

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

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

 

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

8

0 −10

0 2

4 0

3 3

0 7

0 4

5 5

−9 9

 

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

Спрятать решение

Ре­ше­ние.

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

 

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

 

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

 

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

 

 

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

var n, i, x, y, maxPosY, minPosY, maxNegY, minNegY, maxNegAbsX, maxPosAbsX, 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 y > 0 then

begin

if x = 0 then

begin

if minPosY = 0 then

minPosY := y;

maxPosY := max(maxPosY, y);

minPosY := min(minPosY, y);

end else

maxPosAbsX := max(maxPosAbsX, abs(x));

end;

if y < 0 then

begin

if x = 0 then

begin

if maxNegY = 0 then

maxNegY := y;

maxNegY := max(maxNegY, y);

minNegY := min(minNegY, y);

end else

maxNegAbsX := max(maxNegAbsX, abs(x));

end;

end;

s := max((maxPosY - minPosY) * maxPosAbsX, (maxNegY - minNegY) * maxNegAbsX);

writeln(s / 2 :1:1);

end.

Спрятать критерии
Критерии проверки:

Кри­те­рии оце­ни­ва­ния вы­пол­не­ния за­да­нияБаллы
Про­грам­ма пра­виль­но ра­бо­та­ет для любых вход­ных дан­ных про­из­воль­но­го раз­ме­ра и на­хо­дит ответ, не со­хра­няя вход­ные дан­ные в мас­си­ве. До­пус­ка­ет­ся на­ли­чие в тек­сте про­грам­мы одной син­так­си­че­ской ошиб­ки: про­пу­щен или не­вер­но ука­зан знак пунк­ту­а­ции, не­вер­но на­пи­са­но или про­пу­ще­но за­ре­зер­ви­ро­ван­ное слово языка про­грам­ми­ро­ва­ния, не опи­са­на или не­вер­но опи­са­на пе­ре­мен­ная, при­ме­ня­ет­ся опе­ра­ция, не­до­пу­сти­мая для со­от­вет­ству­ю­ще­го типа дан­ных (если одна и та же ошиб­ка встре­ча­ет­ся не­сколь­ко раз, то это счи­та­ет­ся за одну ошиб­ку).4
Про­грам­ма ра­бо­та­ет верно, но раз­мер ис­поль­зу­е­мой па­мя­ти за­ви­сит от длины ис­поль­зу­е­мой по­сле­до­ва­тель­но­сти. На­при­мер, вход­ные дан­ные за­по­ми­на­ют­ся в мас­си­ве или дру­гой струк­ту­ре дан­ных (на­при­мер, кон­тей­нер priority queue, set или map в C++), раз­мер ко­то­ро­го со­от­вет­ству­ет ко­ли­че­ству про­чи­тан­ных чисел. До­пус­ка­ет­ся на­ли­чие от одной до трёх син­так­си­че­ских оши­бок. Воз­мож­но, в прин­ци­пи­аль­но верно ор­га­ни­зо­ван­ном вводе дан­ных есть ошиб­ка.3
Про­грам­ма ра­бо­та­ет в целом верно, эф­фек­тив­но или нет, но в ре­а­ли­за­ции ал­го­рит­ма со­дер­жат­ся ошиб­ки при ини­ци­а­ли­за­ции цикла ана­ли­за мас­си­ва дан­ных или об­ра­бот­ке конца мас­си­ва. До­пус­ка­ет­ся на­ли­чие от одной до пяти син­так­си­че­ских оши­бок, опи­сан­ных выше.2
В про­грам­ме есть блок вы­де­ле­ния оче­ред­но­го участ­ка воз­рас­та­ния, од­на­ко этот блок на­пи­сан с ошиб­ка­ми. До­пус­ка­ет­ся на­ли­чие от одной до пяти син­так­си­че­ских оши­бок, опи­сан­ных выше1
Про­чее0
Мак­си­маль­ный балл4