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

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

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

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

Га­ран­ти­ру­ет­ся, что такое число R в по­сле­до­ва­тель­но­сти будет най­де­но.

 

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

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

 

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

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

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

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

 

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

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

 

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

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

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

5

60

100

8

9

90

800

 

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

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

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

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

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

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

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

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

Ре­ше­ние.

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

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

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

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

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

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

 

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

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

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

 

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

program c4;

var

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

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

a3, b3: integer; {макс. числа, крат­ные 3, но не крат­ные 5}

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

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

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

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

i: integer;

begin

readln(N);

a3:=0; b3:=0;

a5:=0; b5:=0;

a0:=0; b0:=0;

for i:=1 to N do begin

readln(x);

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

else if x mod 3 = 0 then begin

if x>a3 then begin b3:=a3; a3:=x end

else if x>b3 then b3:=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*a3;

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

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

if a3*b3>m then m:=a3*b3;

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 a3=0, b3=0; /*макс. числа, крат­ные 3, но не крат­ные 5*/

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

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

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

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

int i;

cin >> N;

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

cin >> x;

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

if (x % 3 == 0) {

if (x>a3) {b3=a3; a3=x;}

else if (x>b3) b3=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*a3;

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

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

if (a3*b3>m) m=a3*b3;

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 a3, b3 AS INTEGER 'макс. числа, крат­ные 3, но не крат­ные 5

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

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

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

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

DIM i AS INTEGER

INPUT N

FOR i = 1 TO N

INPUT x

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

ELSEIF x MOD 3 = 0 THEN

IF x > a3 THEN

b3 = a3: a3 = x

ELSEIF x > b3 THEN b3 = 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 * a3

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

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

IF a3 * b3 > m THEN m = a3 * b3

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 | ис­ход­ные дан­ные

цел a3=0, b3=0 | макс. числа, крат­ные 3, но не крат­ные 5

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

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

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

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

ввод N

нц N раз

ввод x

выбор

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

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

выбор

при x>a3: b3:=a3; a3:=x

при x>b3: b3:=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*a3

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

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

если a3*b3>m то m:=a3*b3 все

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

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

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

если m>0

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

все

если R>0 и R=m

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

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

все

кон

 

При­ведём ре­ше­ние Ильи Му­ра­то­ва, Python.

 

n = int(input())

max31 = max32 = max51 = max52 = max01 = max02 = 0

for i in range(n):

k = int(input())

if k % 15 != 0:

    if k % 3 == 0:

        if max31 < k:

            max32 = max31

            max31 = k

        elif max32 < k:

            max32 = k

    elif k % 5 == 0:

        if max51 < k:

            max52 = max51

            max51 = k

        elif max52 < k:

            max52 = k

else:

    if max01 < k:

        max02 = max01

        max01 = k

    elif max02 < k:

        max02 = k

R = int(input())

t = max([max31 * max32, max51 * max52, max01 * max02, max31 * max01, max51 * max01])

print "По­лу­че­но чисел: ", n

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

print "Вы­чис­лен­ное кон­троль­ное зна­че­ние: ", t

if R == t:

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

else:

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

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

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

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

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

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

Далее уточ­ня­ют­ся пе­ре­чис­лен­ные выше кри­те­рии.

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

До­пус­ка­ет­ся одна из сле­ду­ю­щих оши­бок:

1) Не­вер­но или не­пол­но оформ­ля­ет­ся вывод ре­зуль­та­тов.

2) Вы­во­дит­ся ну­ле­вое (или какое-то дру­гое) вы­чис­лен­ное

кон­троль­ное зна­че­ние, когда в по­сле­до­ва­тель­но­сти нет пары чисел, про­из­ве­де­ние ко­то­рых не крат­но 10.

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

До­пус­ка­ет­ся на­ли­чие от одной до трёх син­так­си­че­ских оши­бок, опи­сан­ных в кри­те­ри­ях на 4 балла.

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

До­пус­ка­ет­ся на­ли­чие не­сколь­ких со­дер­жа­тель­ных оши­бок, опи­сан­ных в кри­те­ри­ях на 3 балла, и до пяти син­так­си­че­ских оши­бок, опи­сан­ных в кри­те­ри­ях на 4 балла.

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

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