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

На вход про­грам­мы по­сту­па­ет по­сле­до­ва­тель­ность из n целых по­ло­жи­тель­ных чисел. Рас­смат­ри­ва­ют­ся все пары эле­мен­тов по­сле­до­ва­тель­но­сти ai и aj, такие что i < j и ai > aj (пер­вый эле­мент пары боль­ше вто­ро­го; i и j  — по­ряд­ко­вые но­ме­ра чисел в по­сле­до­ва­тель­но­сти вход­ных дан­ных). Среди пар, удо­вле­тво­ря­ю­щих этому усло­вию, не­об­хо­ди­мо найти и на­пе­ча­тать пару с мак­си­маль­ной сум­мой эле­мен­тов, ко­то­рая де­лит­ся на m  =  120. Если среди най­ден­ных пар мак­си­маль­ную сумму имеют не­сколь­ко, то можно на­пе­ча­тать любую из них.

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

В пер­вой стро­ке вход­ных дан­ных задаётся ко­ли­че­ство чисел n (2 ≤ n ≤ 12 000).

В каж­дой из по­сле­ду­ю­щих n строк за­пи­са­но одно целое по­ло­жи­тель­ное число, не пре­вы­ша­ю­щее 10 000.

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

 

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

6

60

140

61

100

300

59

 

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

140 100

 

По­яс­не­ние. Из шести за­дан­ных чисел можно со­ста­вить три пары, сумма эле­мен­тов ко­то­рых де­лит­ся на m  =  120: 60 + 300, 140 + 100 и 61 + 59. Во вто­рой и тре­тьей из этих пар пер­вый эле­мент боль­ше вто­ро­го, но во вто­рой паре сумма боль­ше.

Тре­бу­ет­ся на­пи­сать эф­фек­тив­ную по вре­ме­ни и па­мя­ти про­грам­му для ре­ше­ния опи­сан­ной за­да­чи.

Про­грам­ма счи­та­ет­ся эф­фек­тив­ной по вре­ме­ни, если при од­но­вре­мен­ном уве­ли­че­нии ко­ли­че­ства эле­мен­тов по­сле­до­ва­тель­но­сти n и па­ра­мет­ра m в k раз время ра­бо­ты про­грам­мы уве­ли­чи­ва­ет­ся не более чем в k раз.

Про­грам­ма счи­та­ет­ся эф­фек­тив­ной по па­мя­ти, если па­мять, не­об­хо­ди­мая для хра­не­ния всех пе­ре­мен­ных про­грам­мы, не пре­вы­ша­ет 4 ки­ло­бай­та и не уве­ли­чи­ва­ет­ся с ро­стом n.

Мак­си­маль­ная оцен­ка за пра­виль­ную (не со­дер­жа­щую син­так­си­че­ских оши­бок и да­ю­щую пра­виль­ный ответ при любых до­пу­сти­мых вход­ных дан­ных) про­грам­му, эф­фек­тив­ную по вре­ме­ни и па­мя­ти,  — 4 балла. Мак­си­маль­ная оцен­ка за пра­виль­ную про­грам­му, воз­мож­но, не­эф­фек­тив­ную по па­мя­ти или время вы­пол­не­ния ко­то­рой су­ще­ствен­но за­ви­сит от ве­ли­чи­ны m,  — 3 балла.

Мак­си­маль­ная оцен­ка за пра­виль­ную про­грам­му, не удо­вле­тво­ря­ю­щую тре­бо­ва­ни­ям эф­фек­тив­но­сти,  — 2 балла.

Вы мо­же­те сдать одну про­грам­му или две про­грам­мы ре­ше­ния за­да­чи (на­при­мер, одна из про­грамм может быть менее эф­фек­тив­на). Если Вы сда­ди­те две про­грам­мы, то каж­дая из них будет оце­ни­вать­ся не­за­ви­си­мо от дру­гой, ито­го­вой ста­нет бо́льшая из двух оце­нок.

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

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

Ре­ше­ние.

Сумма ai и aj де­лит­ся на m, если сумма остат­ков этих чисел от де­ле­ния на m равна 0 или m. Для каж­до­го из остат­ков от де­ле­ния на m среди уже про­смот­рен­ных эле­мен­тов будем хра­нить мак­си­маль­ное число, име­ю­щее со­от­вет­ству­ю­щий оста­ток от де­ле­ния на m. Для этого будем ис­поль­зо­вать мас­сив r дли­ной m, из­на­чаль­но с эле­мен­та­ми, рав­ны­ми 0. Все счи­тан­ные зна­че­ния при этом можно не хра­нить.

Оче­ред­ное счи­тан­ное число a будем рас­смат­ри­вать как воз­мож­ный пра­вый эле­мент ис­ко­мой пары. Пусть оста­ток от де­ле­ния a на m равен p. Тогда если r[mp] > 0, то сумма a и r[mp] де­лит­ся на m, и при усло­вии r[mp] > a эта пара  — кан­ди­дат для от­ве­та. Если их сумма боль­ше преды­ду­ще­го от­ве­та, то за­ме­ним его. При этом если оста­ток от де­ле­ния a на m равен 0, то рас­смат­ри­вать надо пару a и r[0].

По окон­ча­нии об­ра­бот­ки эле­мен­та a не­об­хо­ди­мо об­но­вить эле­мент r[p] зна­че­ни­ем a, если a > r[p]. Ниже при­ве­де­на ре­а­ли­зу­ю­щая опи­сан­ный ал­го­ритм про­грам­ма на языке Пас­каль (ис­поль­зо­ва­на вер­сия PascalABC)

 

 

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

 

const m = 120; {ко­ли­че­ство раз­лич­ных остат­ков}

var

    {хра­не­ние мак­си­маль­но­го зна­че­ния для каж­до­го из остат­ков}

    r: array[0..m-1] of integer;

    n, a, i, p, left, right: integer;

begin

    readln(n);

    {об­ну­ле­ние мас­си­ва r}

    for i := 0 to m - 1 do

        r[i] := 0;

    {об­ну­ле­ние пе­ре­мен­ных для за­пи­си от­ве­та}

    left := 0; right := 0;

    {ввод зна­че­ний, поиск ис­ко­мой пары}

    for i := 1 to n do

    begin

        readln(a); {счи­ты­ва­ем оче­ред­ное зна­че­ние}

    p := a mod m;

        if p = 0 then

        begin

            if (r[0] > a) and (r[0] + a > left + right) then

            begin

                left := r[0]; right := a {об­нов­ле­ние от­ве­та}

            end

        end

        else

        begin

            if (r[m - p] > a) and (r[m - p] + a > left + right) then

            begin

                left := r[m - p]; right := a {об­нов­ле­ние от­ве­та}

            end

        end;

        {об­нов­ле­ние эле­мен­та r для со­от­вет­ству­ю­ще­го остат­ка}

        if a > r[p] then r[p] := a

    end;

    writeln(left, ' ',right)

end.

 

При­мер 2. Про­грам­ма на языке Python 3. Про­грам­ма эф­фек­тив­на по вре­ме­ни и па­мя­ти.

 

m = 120

# со­зда­ние мас­си­ва для мак­си­маль­ных зна­че­ний

# для каж­до­го из остат­ков

r = [0] * m

# об­ну­ле­ние пе­ре­мен­ных для за­пи­си от­ве­та

left = 0

right = 0

# ввод ко­ли­че­ства эле­мен­тов

n = int(input())

# ввод зна­че­ний, поиск ис­ко­мой пары

for i in range(n):

    a = int(input())

    p = a % m;

    if r[(m - p) % m] > a and r[(m - p) % m] + a > left + right:

        #об­нов­ле­ние от­ве­та

        left = r[(m - p) % m]

        right = a;

    # об­нов­ле­ние эле­мен­та r для со­от­вет­ству­ю­ще­го остат­ка

    if a > r[p]:

        r[p] = a

print(left, right)

 

При­мер 3. Про­грам­ма на языке С++. Про­грам­ма эф­фек­тив­на по вре­ме­ни и па­мя­ти.

 

#include <iostream>

using namespace std;

int main()

{

    int n, a, p, left, right;

    int r[120];

    int m = 120;

    cin >> n;

    //об­ну­ле­ние мас­си­ва r

    for (int i = 0; i < m; ++i)

        r[i] = 0;

    //об­ну­ле­ние пе­ре­мен­ных для за­пи­си от­ве­та

    left = 0; right = 0;

    // ввод зна­че­ний, поиск ис­ко­мой пары

    for (int i = 0; i < n; ++i)

    {

        cin >> a; //счи­ты­ва­ем оче­ред­ное зна­че­ние

        p = a % m;

        if (p == 0) p = m;

        if (r[m - p] > a && r[m - p] + a > left + right)

        {

            left = r[m - p]; right = a; //об­нов­ле­ние от­ве­та

        }

        // об­нов­ле­ние эле­мен­та r для со­от­вет­ству­ю­ще­го остат­ка

        if (p < m)

        {

        if (a > r[p]) r[p] = a;

        }

        else if (a > r[0]) r[0] = a;

    }

    cout << left << ' ' << right;

}

 

При­во­дим эф­фек­тив­ное ре­ше­ние Ни­ко­лая Ар­тю­хи­на на C++.

#include <iostream>

using namespace std;

int main()

{

    int a[120],n, i, x, p, r, m1=0, m2=0;

    cin >> n;

    for(i=0;i<120;i++){

         a[i]=0;

    }

    for(i=0;i<n;i++){

        cin >> x;

        p=x%120;

        r=(120-p)%120;

        if((x+a[r]>m1+m2)&&(a[r]>x)){

             m1=a[r];

             m2=x;

        }

        if(x>a[p]) a[p]=x;

    }

    cout << m1 << " " << m2;

     return 0;

}

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

Кри­те­рии оце­ни­ва­ния вы­пол­не­ния за­да­нияБаллы
Про­грам­ма пра­виль­но ра­бо­та­ет для любых вход­ных дан­ных про­из­воль­но­го раз­ме­ра при усло­вии ис­прав­ле­ния в ней не более трёх син­так­си­че­ских оши­бок из при­ведённого ниже спис­ка до­пу­сти­мых оши­бок. Ис­поль­зу­е­мая па­мять не за­ви­сит от ко­ли­че­ства про­чи­тан­ных чисел, а время ра­бо­ты про­пор­ци­о­наль­но этому ко­ли­че­ству.

До­пус­ка­ет­ся на­ли­чие в тек­сте про­грам­мы до трёх син­так­си­че­ских

оши­бок од­но­го из сле­ду­ю­щих видов:

1) про­пу­щен или не­вер­но ука­зан знак пунк­ту­а­ции;

2) не­вер­но на­пи­са­но, про­пу­ще­но или на­пи­са­но лиш­нее

за­ре­зер­ви­ро­ван­ное слово языка про­грам­ми­ро­ва­ния;

3) не опи­са­на или не­вер­но опи­са­на пе­ре­мен­ная;

4) при­ме­ня­ет­ся опе­ра­ция, не до­пу­сти­мая для со­от­вет­ству­ю­ще­го типа дан­ных.

Если одна и та же ошиб­ка встре­ча­ет­ся не­сколь­ко раз, это счи­та­ет­ся за одну ошиб­ку.

4
Не вы­пол­не­ны усло­вия, поз­во­ля­ю­щие по­ста­вить 4 балла.

Про­грам­ма ра­бо­та­ет пра­виль­но для любых вход­ных дан­ных про­из­воль­но­го раз­ме­ра при усло­вии ис­прав­ле­ния в ней не более пяти син­так­си­че­ских оши­бок из при­ведённого в кри­те­ри­ях на 4 балла спис­ка и не более одной ошиб­ки из при­ведённого ниже спис­ка со­дер­жа­тель­ных оши­бок. Время ра­бо­ты про­пор­ци­о­наль­но ко­ли­че­ству введённых чисел, но может су­ще­ствен­но за­ви­сеть от m

(см. ком­мен­та­рий к эф­фек­тив­но­му ре­ше­нию за­да­чи). До­пус­ка­ет­ся на­ли­чие не более одной со­дер­жа­тель­ной ошиб­ки сле­ду­ю­щих видов:

1) до­пу­ще­на ошиб­ка при вводе дан­ных (на­при­мер, не

счи­ты­ва­ет­ся зна­че­ние N, или числа могут быть счи­та­ны, толь­ко если будут за­пи­са­ны в одной стро­ке через про­бел);

2) не­вер­ная ини­ци­а­ли­за­ция или её от­сут­ствие там, где она не­об­хо­ди­ма;

3) ис­поль­зу­ет­ся не­вер­ный тип дан­ных, при этом ошиб­ка не яв­ля­ет­ся син­так­си­че­ской;

4) не более од­но­го раза ис­поль­зу­ет­ся одна пе­ре­мен­ная (или кон­стан­та) вме­сто дру­гой, или не более од­но­го раза ис­поль­зу­ет­ся один знак опе­ра­ции вме­сто дру­го­го, или не более од­но­го раза ис­поль­зу­ет­ся одно за­ре­зер­ви­ро­ван­ное слово языка про­грам­ми­ро­ва­ния вме­сто дру­го­го, при этом ошиб­ка не яв­ля­ет­ся син­так­си­че­ской;

5) слу­жеб­ное слово else от­но­сит­ся не к тому if, к ка­ко­му сле­ду­ет;

6) от­сут­ству­ет вывод от­ве­та, или вы­во­дит­ся зна­че­ние не тех пе­ре­мен­ных;

7) выход за гра­ни­цу мас­си­ва (в част­но­сти, при об­ра­ще­нии к m-му эле­мен­ту мас­си­ва с ин­дек­са­ми от 0 до m–1, даже если он су­ще­ству­ет, но не за­пол­нен нуж­ным зна­че­ни­ем);

8) не вы­пол­нен или не­вер­но вы­пол­нен учёт эле­мен­тов, оста­ток от де­ле­ния ко­то­рых на m равен 0.

3 балла также ста­вит­ся за про­грам­му, в ко­то­рой нет

со­дер­жа­тель­ных оши­бок, но ис­поль­зу­е­мая па­мять за­ви­сит от ко­ли­че­ства про­чи­тан­ных чисел (на­при­мер, вход­ные дан­ные за­по­ми­на­ют­ся в мас­си­ве, кон­тей­не­ре STL в C++ или дру­гой ана­ло­гич­ной струк­ту­ре дан­ных).

3
Не вы­пол­не­ны усло­вия, поз­во­ля­ю­щие по­ста­вить 3 или 4 балла.

Про­грам­ма ра­бо­та­ет верно, эф­фек­тив­но по вре­ме­ни при усло­вии ис­прав­ле­ния не более трёх со­дер­жа­тель­ных оши­бок, опи­сан­ных в кри­те­ри­ях на 3 балла и ана­ло­гич­ных им, и не более де­вя­ти син­так­си­че­ских оши­бок, ука­зан­ных в кри­те­ри­ях на 4 балла. При этом в про­грам­ме могут быть опу­ще­ны с по­мо­щью мно­го­то­чия од­но­тип­ные дей­ствия, свя­зан­ные с рас­смот­ре­ни­ем каж­до­го из остат­ков от де­ле­ния на m.

 

Не до­пус­ка­ет­ся вы­став­ле­ние 2 бал­лов за про­грам­му, если в ней учи­ты­ва­ют­ся суммы вида a[i]+a[i] (в том числе в ал­го­рит­ме без хра­не­ния эле­мен­тов по­сле­до­ва­тель­но­сти).

2 балла также ста­вит­ся за кор­рект­ное пе­ре­бор­ное ре­ше­ние, в ко­то­ром все числа со­хра­ня­ют­ся в мас­си­ве (или дру­гой ана­ло­гич­ной струк­ту­ре) и рас­смат­ри­ва­ют­ся все воз­мож­ные пары. При­мер фраг­мен­та со­от­вет­ству­ю­щей про­грам­мы на языке Пас­каль:

left := 0; right := 0;

for i := 1 to N - 1 do

for j := i + 1 to N do

if (a[i] > a[j]) and ((a[i] + a[j]) mod m = 0) then

if a[i] + a[j] > left + right then

begin

left := a[i];

right := a[j]

end;

В цикле ре­а­ли­за­ции пе­ре­бор­но­го ал­го­рит­ма не до­пус­ка­ют­ся выход ин­дек­сов за гра­ни­цы мас­си­ва, а также любые ло­ги­че­ские ошиб­ки

2
Не вы­пол­не­ны усло­вия, поз­во­ля­ю­щие по­ста­вить 2, 3 или 4 балла.

При этом про­грам­ма опи­сы­ва­ет в целом пра­виль­ный ал­го­ритм (эф­фек­тив­ный или нет) и в ней при­сут­ству­ет не менее двух эле­мен­тов ре­ше­ния из пе­ре­чис­лен­ных ниже, воз­мож­но, ре­а­ли­зо­ван­ных с ошиб­ка­ми:

• учи­ты­ва­ет­ся усло­вие a[i] > a[j];

• про­ве­ря­ет­ся де­ли­мость суммы на m;

• ищет­ся пара с мак­си­маль­ной сум­мой.

В слу­чае, если в любом ре­ше­нии со­дер­жит­ся не более од­но­го из ука­зан­ных эле­мен­тов, про­грам­ма оце­ни­ва­ет­ся в 0 бал­лов.

1
Не вы­пол­не­ны кри­те­рии, поз­во­ля­ю­щие по­ста­вить 1, 2, 3 или 4 балла.0
Мак­си­маль­ный балл4
Источник: Де­мон­стра­ци­он­ная вер­сия ЕГЭ−2020 по ин­фор­ма­ти­ке