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

По ка­на­лу связи пе­ре­даётся по­сле­до­ва­тель­ность по­ло­жи­тель­ных целых чисел. Все числа не пре­вы­ша­ют 1000, их ко­ли­че­ство из­вест­но, но может быть очень ве­ли­ко. Затем пе­ре­даётся кон­троль­ное зна­че­ние  — наи­боль­шее число R, удо­вле­тво­ря­ю­щее сле­ду­ю­щим усло­ви­ям:

1)  R  — про­из­ве­де­ние двух раз­лич­ных пе­ре­дан­ных эле­мен­тов по­сле­до­ва­тель­но­сти («раз­лич­ные» озна­ча­ет, что не рас­смат­ри­ва­ют­ся квад­ра­ты пе­ре­дан­ных чисел, про­из­ве­де­ния раз­лич­ных, но рав­ных по ве­ли­чи­не эле­мен­тов до­пус­ка­ют­ся);

2)  R не де­лит­ся на 10.

 

В ре­зуль­та­те помех при пе­ре­да­че как сами числа, так и кон­троль­ное зна­че­ние могут быть ис­ка­же­ны.

На­пи­ши­те про­грам­му ко­то­рая будет про­ве­рять пра­виль­ность кон­троль­но­го зна­че­ния. Про­грам­ма долж­на на­пе­ча­тать отчёт по сле­ду­ю­щей форме:

 

По­лу­че­но чисел: …

При­ня­тое кон­троль­ное зна­че­ние: …

Вы­чис­лен­ное кон­троль­ное зна­че­ние: …

Кон­троль прой­ден (или Кон­троль не прой­ден)

 

Если удо­вле­тво­ря­ю­щее усло­вию кон­троль­ное зна­че­ние опре­де­лить не­воз­мож­но, вы­чис­лен­ное кон­троль­ное зна­че­ние не вы­во­дит­ся, но вы­во­дит­ся фраза «Кон­троль не прой­ден».

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

 

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

Ито­го­вая оцен­ка вы­став­ля­ет­ся как мак­си­маль­ная из оце­нок за за­да­ния А и Б. Если ре­ше­ние од­но­го из за­да­ний не пред­став­ле­но, то счи­та­ет­ся, что оцен­ка за это за­да­ние со­став­ля­ет 0 бал­лов.

За­да­ние Б яв­ля­ет­ся услож­нен­ным ва­ри­ан­том за­да­ния А, оно со­дер­жит до­пол­ни­тель­ные тре­бо­ва­ния к про­грам­ме. Перед про­грам­мой ука­жи­те вер­сию языка про­грам­ми­ро­ва­ния.

 

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

Обя­за­тель­но ука­жи­те, что про­грам­ма яв­ля­ет­ся ре­ше­ни­ем за­да­ния А.

Мак­си­маль­ная оцен­ка за вы­пол­не­ние за­да­ния А – 2 балла.

Б. На­пи­ши­те про­грам­му для ре­ше­ния по­став­лен­ной за­да­чи, ко­то­рая будет эф­фек­тив­на как по вре­ме­ни, так и по па­мя­ти (или хотя бы по одной из этих ха­рак­те­ри­стик).

Про­грам­ма счи­та­ет­ся эф­фек­тив­ной по вре­ме­ни, если время ра­бо­ты про­грам­мы про­пор­ци­о­наль­но ко­ли­че­ству эле­мен­тов по­сле­до­ва­тель­но­сти N, т. е. при уве­ли­че­нии N в k раз время ра­бо­ты про­грам­мы долж­но уве­ли­чи­вать­ся не более чем в k раз. Обя­за­тель­но ука­жи­те, что про­грам­ма яв­ля­ет­ся ре­ше­ни­ем за­да­ния Б.

 

Вход­ные дан­ные

В пер­вой стро­ке ука­зы­ва­ет­ся ко­ли­че­ство чисел N. В каж­дой из по­сле­ду­ю­щих

N строк за­пи­са­но одно на­ту­раль­ное число, не пре­вы­ша­ю­щее 1000.

В по­след­ней стро­ке за­пи­са­но кон­троль­ное зна­че­ние.

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

5

60

7

8

15

20

105

 

Вы­ход­ные дан­ные

Про­грам­ма долж­на на­пе­ча­тать отчёт по об­раз­цу, при­ведённому в усло­вии.

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

По­лу­че­но чисел: 5

При­ня­тое кон­троль­ное зна­че­ние: 105

Вы­чис­лен­ное кон­троль­ное зна­че­ние: 105

Кон­троль прой­ден

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

Ре­ше­ние.

Про­из­ве­де­ние двух чисел де­лит­ся на 10, если один из со­мно­жи­те­лей де­лит­ся на 10 (вто­рой может быть любым), либо если ни один из со­мно­жи­те­лей не де­лит­ся на 10, но один из со­мно­жи­те­лей де­лит­ся на 2, а дру­гой  — на 5.

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

- крат­ные 10 (класс 10);

- крат­ные 2, но не крат­ные 5 (класс 2);

- крат­ные 5, но не крат­ные 2 (класс 5);

- не крат­ные ни 2, ни 5 (класс 0).

 

Числа, крат­ные 10, можно сразу от­бро­сить: они не могут участ­во­вать в ито­го­вом про­из­ве­де­нии. Про­из­ве­де­ние двух чисел не будет де­лить­ся на 10, если оба числа при­над­ле­жат од­но­му клас­су, либо если числа при­над­ле­жат

раз­ным клас­сам, но не клас­сам 2 и 5. При этом для по­лу­че­ния мак­си­маль­но­го зна­че­ния сле­ду­ет брать мак­си­маль­но воз­мож­ное число из каж­до­го клас­са. Пусть a2  — мак­си­маль­ное число в клас­се 2, b2  — вто­рое по ве­ли­чи­не число в клас­се 2, ана­ло­гич­ным об­ра­зом обо­зна­чим два наи­боль­ших числа в клас­сах 5 и 0. Тогда кон­троль­ным зна­че­ни­ем будет наи­боль­шее из сле­ду­ю­щих про­из­ве­де­ний: a2*b2, a5*b5, a0*b0, a0*a2, a0*a5.

Про­грам­ма чи­та­ет все вход­ные дан­ные один раз, не за­по­ми­ная все дан­ные в мас­си­ве, для каж­до­го вход­но­го числа опре­де­ля­ет его класс, от­бра­сы­ва­ет числа клас­са 10 и хра­нит два наи­боль­ших числа для каж­до­го из осталь­ных клас­сов. После ввода всей по­сле­до­ва­тель­но­сти про­грам­ма вы­чис­ля­ет 5 пе­ре­чис­лен­ных выше про­из­ве­де­ний, вы­би­ра­ет из них наи­боль­шее и срав­ни­ва­ет его с введённым кон­троль­ным зна­че­ни­ем.

 

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

program c4;

var

N: integer; {ко­ли­че­ство чисел на входе}

x: integer; {ис­ход­ные дан­ные}

a2, b2: integer; {макс. числа, крат­ные 2, но не крат­ные 5}

a5, b5: integer; {макс. числа, крат­ные 5, но не крат­ные 2}

a0, b0: integer; {мак­си­маль­ные числа, не крат­ные 5 и 2}

R: integer; {вве­ден­ное кон­троль­ное зна­че­ние}

m: integer; {вы­чис­лен­ное кон­троль­ное зна­че­ние}

i: integer;

begin

readln(N);

a2:=0; b2:=0;

a5:=0; b5:=0;

a0:=0; b0:=0;

for i:=1 to N do begin

readln(x);

if x mod 10 = 0 then {ни­че­го не де­лать}

else if x mod 2 = 0 then begin

if x>a2 then begin b2:=a2; a2:=x end

else if x>b2 then b2:=x

end

else if x mod 5 = 0 then begin

if x>a5 then begin b5:=a5; a5:=x end

else if x>b5 then b5:=x

end

else begin

if x>a0 then begin b0:=a0; a0:=x end

else if x>b0 then b0:=x

end

end;

readln(R);

m := a0*a2;

if a0*a5>m then m:=a0*a5;

if a0*b0>m then m:=a0*b0;

if a2*b2>m then m:=a2*b2;

if a5*b5>m then m:=a5*b5;

writeln('По­лу­че­но чисел: ', N);

writeln('При­ня­тое кон­троль­ное зна­че­ние: ', R);

if m>0 then writeln('Вы­чис­лен­ное кон­троль­ное зна­че­ние: ', m);

if (R>0) and (R=m)

then writeln('Кон­троль прой­ден')

else writeln('Кон­троль не прой­ден')

end.

 

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

#include <stdio.h>

void main ()

{

int N; /*ко­ли­че­ство чисел на входе*/

int x; /*ис­ход­ные дан­ные*/

int a2=0, b2=0; /*макс. числа, крат­ные 2, но не крат­ные 5*/

int a5=0, b5=0; /*макс. числа, крат­ные 5, но не крат­ные 2*/

int a0=0, b0=0; /*мак­си­маль­ные числа, не крат­ные 5 и 2*/

int R; /*вве­ден­ное кон­троль­ное зна­че­ние*/

int m; /*вы­чис­лен­ное кон­троль­ное зна­че­ние*/

int i;

cin >> N;

for (i=1; i<=N; ++i) {

cin >> x;

if (x % 10 == 0) continue; /*ни­че­го не де­лать*/

if (x % 2 == 0) {

if (x>a2) {b2=a2; a2=x;}

else if (x>b2) b2=x;

}

else if (x % 5 == 0) {

if (x>a5) {b5=a5; a5=x;}

else if (x>b5) b5=x;

}

else {

if (x>a0) {b0=a0; a0=x;}

else if (x>b0) b0=x;

}

}

cin >> R;

m = a0*a2;

if (a0*a5>m) m=a0*a5;

if (a0*b0>m) m=a0*b0;

if (a2*b2>m) m=a2*b2;

if (a5*b5>m) m=a5*b5;

printf("По­лу­че­но чисел: %d\n", N);

printf("При­ня­тое кон­троль­ное зна­че­ние: %d\n", R);

if (m>0) printf("Вы­чис­лен­ное кон­троль­ное зна­че­ние: %d\n", m);

if (R>0 && R==m) cout << "Кон­троль прой­ден\n";

else cout << "Кон­троль не прой­ден\n";

}

 

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

DIM N AS INTEGER 'ко­ли­че­ство чисел на входе

DIM x AS INTEGER 'ис­ход­ные дан­ные

DIM a2, b2 AS INTEGER 'макс. числа, крат­ные 2, но не крат­ные 5

DIM a5, b5 AS INTEGER 'макс. числа, крат­ные 5, но не крат­ные 2

DIM a0, b0 AS INTEGER 'мак­си­маль­ные числа, не крат­ные 5 и 2

DIM R AS INTEGER 'вве­ден­ное кон­троль­ное зна­че­ние

DIM m AS INTEGER 'вы­чис­лен­ное кон­троль­ное зна­че­ние

DIM i AS INTEGER

INPUT N

FOR i = 1 TO N

INPUT x

IF x MOD 10 = 0 THEN 'ни­че­го не де­лать

ELSEIF x MOD 2 = 0 THEN

IF x > a2 THEN

b2 = a2: a2 = x

ELSEIF x > b2 THEN b2 = x

END IF

ELSEIF x MOD 5 = 0 THEN

IF x > a5 THEN

b5 = a5: a5 = x

ELSEIF x > b5 THEN b5 = x

END IF

ELSE

IF x > a0 THEN

b0 = a0: a0 = x

ELSEIF x > b0 THEN b0 = x

END IF

END IF

NEXT i

INPUT R

m = a0 * a2

IF a0 * a5 > m THEN m = a0 * a5

IF a0 * b0 > m THEN m = a0 * b0

IF a2 * b2 > m THEN m = a2 * b2

IF a5 * b5 > m THEN m = a5 * b5

PRINT "По­лу­че­но чисел: "; N

PRINT "При­ня­тое кон­троль­ное зна­че­ние: "; R

IF m > 0 THEN PRINT "Вы­чис­лен­ное кон­троль­ное зна­че­ние: "; m

IF (R > 0) AND (R = m) THEN

PRINT "Кон­троль прой­ден"

ELSE

PRINT "Кон­троль не прой­ден"

END IF

 

 

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

алг

нач

цел N | ко­ли­че­ство чисел на входе

цел x | ис­ход­ные дан­ные

цел a2=0, b2=0 | макс. числа, крат­ные 2, но не крат­ные 5

цел a5=0, b5=0 | макс. числа, крат­ные 5, но не крат­ные 2

цел a0=0, b0=0 | мак­си­маль­ные числа, не крат­ные 5 и 2

цел R | вве­ден­ное кон­троль­ное зна­че­ние

цел m | вы­чис­лен­ное кон­троль­ное зна­че­ние

ввод N

нц N раз

ввод x

выбор

при mod(x, 10) = 0: | ни­че­го не де­лать

при mod(x, 2) = 0:

выбор

при x>a2: b2:=a2; a2:=x

при x>b2: b2:=x

все

при mod(x, 5) = 0:

выбор

при x>a5: b5:=a5; a5:=x

при x>b5: b5:=x

все

иначе

выбор

при x>a0: b0:=a0; a0:=x

при x>b0: b0:=x

все

все

кц

ввод R

m := a0*a2

если a0*a5>m то m:=a0*a5 все

если a0*b0>m то m:=a0*b0 все

если a2*b2>m то m:=a2*b2 все

если a5*b5>m то m:=a5*b5 все

вывод "По­лу­че­но чисел: ", N

вывод нс, "При­ня­тое кон­троль­ное зна­че­ние: ", R

если m>0

то вывод нс, "Вы­чис­лен­ное кон­троль­ное зна­че­ние: ", m

все

если R>0 и R=m

то вывод нс, "Кон­троль прой­ден"

иначе вывод нс, "Кон­троль не прой­ден"

все

кон

 

При­мер ре­ше­ния за­да­чи А на языке Пас­каль.

var

a: array[1..10000] of integer; {ис­ход­ные дан­ные}

N: integer; {ко­ли­че­ство эле­мен­тов по­сле­до­ва­тель­но­сти}

R: integer; {при­ни­ма­е­мое кон­троль­ное зна­че­ние}

max: integer; {вы­чис­ля­е­мое кон­троль­ное зна­че­ние}

i, j: integer;

begin

readln(N);

max := 0;

for i := 1 to N do read(a[i]);

for i := 1 to N-1 do

for j := i+1 to N do

if (a[i]*a[j] > max) and (a[i]*a[j] mod 10 <> 0) then max := a[i] * a[j];

readln(R);

writeln('По­лу­че­но чисел: ', N);

writeln('При­ня­тое кон­троль­ное зна­че­ние: ', R);

if max>0 then writeln('Вы­чис­лен­ное кон­троль­ное зна­че­ние: ', max);

if (R>0) and (R=max) then writeln('Кон­троль прой­ден')

else writeln('Кон­троль не прой­ден');

end.

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

По­яс­не­ния для про­ве­ря­ю­щих.

1. За­да­ние Б яв­ля­ет­ся услож­не­ни­ем за­да­ния А. Если в ка­че­стве ре­ше­ния за­да­ния Б пред­став­ле­но ре­ше­ние за­да­ния А, то со­глас­но при­ведённым ниже кри­те­ри­ям, его оцен­ка будет такой же, как если бы это ре­ше­ние было пред­став­ле­но в ка­че­стве ре­ше­ния за­да­ния А.

2. Два за­да­ния и, со­от­вет­ствен­но, воз­мож­ность для эк­за­ме­ну­е­мо­го пред­ста­вить две про­грам­мы дают уче­ни­ку воз­мож­ность (при его же­ла­нии) сна­ча­ла на­пи­сать менее слож­ное и менее эф­фек­тив­ное ре­ше­ние (за­да­ние А), ко­то­рое даёт ему право по­лу­чить два балла, а затем при­сту­пить к по­ис­ку более эф­фек­тив­но­го ре­ше­ния.

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

 

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

До­пус­ка­ет­ся на­ли­чие в тек­сте про­грам­мы до трех син­так­си­че­ских оши­бок од­но­го из сле­ду­ю­щих видов:

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

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

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

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

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

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

Ко­ли­че­ство син­так­си­че­ских оши­бок (опи­сок) ука­зан­ных выше видов — не более пяти.

Ис­поль­зу­е­мая па­мять, воз­мож­но, за­ви­сит от ко­ли­че­ства про­чи­тан­ных чисел (на­при­мер, вход­ные дан­ные за­по­ми­на­ют­ся в мас­си­ве или дру­гой струк­ту­ре дан­ных (кон­тей­нер priority_queue, vector, set или map в С++)).

До­пус­ка­ет­ся ошиб­ка при вводе дан­ных, не­вер­ный или не­пол­ный вывод ре­зуль­та­тов или не­вер­ная ра­бо­та про­грам­мы

в «эк­зо­ти­че­ских» си­ту­а­ци­ях. Кроме того, до­пус­ка­ет­ся на­ли­чие одной ошиб­ки, при­над­ле­жа­щей к од­но­му из сле­ду­ю­щих видов оши­бок:

1) ошиб­ка при ини­ци­а­ли­за­ции ми­ни­му­мов;

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

3) до­пу­щен выход за гра­ни­цу мас­си­ва;

4) ис­поль­зу­ет­ся знак < вме­сто <=, or вме­сто and и т. п.

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

min := 2001;

for i := 1 to N - 1 do begin

for j := i + 1 to N do begin

if ((a[i]+a[j]) mod 2 = 1) and

(a[i]+a[j] < min) then min := a[i]+a[j];

end

end;

2
Не вы­пол­не­ны усло­вия, поз­во­ля­ю­щие по­ста­вить 2, 3 или 4 балла. Из опи­са­ния ал­го­рит­ма или общей струк­ту­ры про­грам­мы видно, что эк­за­ме­ну­е­мый в целом пра­виль­но пред­став­ля­ет путь ре­ше­ния за­да­чи не­за­ви­си­мо от эф­фек­тив­но­сти. При этом про­грам­ма может от­сут­ство­вать или быть пред­став­лен­ной от­дель­ны­ми фраг­мен­та­ми, без огра­ни­че­ний на ко­ли­че­ство оши­бок.1
Не вы­пол­не­ны кри­те­рии, поз­во­ля­ю­щие по­ста­вить 1, 2, 3 или 4 балла0
Мак­си­маль­ный балл4

Аналоги к заданию № 6971: 7003 Все