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

На плос­ко­сти дан набор точек с це­ло­чис­лен­ны­ми ко­ор­ди­на­та­ми. Не­об­хо­ди­мо найти четырёхуголь­ник наи­боль­шей пло­ща­ди с вер­ши­на­ми в этих точ­ках, две вер­ши­ны ко­то­ро­го лежат на оси 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

 

При­мер пра­виль­ной, но не­эф­фек­тив­ной про­грам­мы на языке Пас­каль.

var

coord: 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