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

Дед Мороз и Сне­гу­роч­ка при­хо­дят на дет­ские утрен­ни­ки с меш­ком кон­фет. Дед Мороз делит кон­фе­ты по­ров­ну между всеми при­сут­ству­ю­щи­ми детьми (детей на утрен­ни­ке ни­ко­гда не бы­ва­ет боль­ше 100), а остав­ши­е­ся кон­фе­ты от­да­ет Сне­гу­роч­ке. Сне­гу­роч­ка каж­дый раз за­пи­сы­ва­ет в блок­нот ко­ли­че­ство по­лу­чен­ных кон­фет. Если кон­фе­ты раз­де­ли­лись между всеми детьми без остат­ка, Сне­гу­роч­ка ни­че­го не по­лу­ча­ет и ни­че­го не за­пи­сы­ва­ет. Когда утрен­ни­ки за­кон­чи­лись, Деду Мо­ро­зу стало ин­те­рес­но, сколь­ко раз­лич­ных чисел встре­ча­ет­ся в за­пи­сях Сне­гу­роч­ки. Дед Мороз и Сне­гу­роч­ка  — вол­шеб­ные, по­это­му число утрен­ни­ков N, на ко­то­рых они по­бы­ва­ли, может быть очень боль­шим. На­пи­ши­те про­грам­му, ко­то­рая будет ре­шать эту за­да­чу. Перед тек­стом про­грам­мы крат­ко опи­ши­те ал­го­ритм ре­ше­ния за­да­чи и ука­жи­те ис­поль­зу­е­мый язык про­грам­ми­ро­ва­ния и его вер­сию.

Же­ла­тель­но, чтобы про­грам­ма была эф­фек­тив­ной как по вре­ме­ни ра­бо­ты, так и по ис­поль­зу­е­мой па­мя­ти. Про­грам­му будем счи­тать эф­фек­тив­ной по па­мя­ти, если ис­поль­зу­е­мая па­мять не за­ви­сит от раз­ме­ра вход­ных дан­ных (то есть числа утрен­ни­ков). Про­грам­му будем счи­тать эф­фек­тив­ной по вре­ме­ни, если при уве­ли­че­нии раз­ме­ра вход­ных дан­ных N в t раз (t  — любое число) время её ра­бо­ты уве­ли­чи­ва­ет­ся не более чем в t раз.

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

В пер­вой стро­ке вво­дит­ся одно целое по­ло­жи­тель­ное число  — ко­ли­че­ство утрен­ни­ков N. Каж­дая из сле­ду­ю­щих N строк со­дер­жит два целых числа: сна­ча­ла D  — ко­ли­че­ство при­шед­ших на оче­ред­ной утрен­ник детей, а затем K – ко­ли­че­ство кон­фет в мешке Деда Мо­ро­за на этом утрен­ни­ке. Га­ран­ти­ру­ет­ся вы­пол­не­ние сле­ду­ю­щих со­от­но­ше­ний:

1 ≤ N ≤ 10000

1 ≤ D ≤ 100 (для каж­до­го D)

D ≤ K ≤ 1000 (для каж­дой пары D, K)

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

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

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

7

10 58

15 315

20 408

100 1000

32 63

32 63

11 121

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

2

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

Ре­ше­ние.

По­сколь­ку ко­ли­че­ство детей не пре­вы­ша­ет 100, остать­ся может не боль­ше 99 кон­фет. Можно со­здать мас­сив из 99 эле­мен­тов и ис­поль­зо­вать их в ка­че­стве счётчи­ков, хра­ня­щих ин­фор­ма­цию о ко­ли­че­стве за­пи­сей каж­до­го числа. Про­грам­ма чи­та­ет ис­ход­ные дан­ные, не за­по­ми­ная их в мас­си­ве. Для каж­дой пары (D, K) ко­ли­че­ство остав­ших­ся кон­фет опре­де­ля­ет­ся как оста­ток от де­ле­ния K на D. Если этот оста­ток по­ло­жи­те­лен, надо уве­ли­чить со­от­вет­ству­ю­щий счётчик. По окон­ча­нии ввода и об­ра­бот­ки дан­ных надо под­счи­тать ко­ли­че­ство не­ну­ле­вых эле­мен­тов в мас­си­ве счётчи­ков.

 

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

 

program c4;

const DMAX=100; {мак­си­маль­но воз­мож­ное ко­ли­че­ство

детей}

var

N: integer; {ко­ли­че­ство утрен­ни­ков}

D: integer; {ко­ли­че­ство детей на утрен­ни­ке}

K: integer; {ко­ли­че­ство кон­фет}

r: integer; {оста­ток}

c: array[1..DMAX-1] of integer; {счет­чи­ки остат­ков}

i: integer;

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

begin

{пред­ва­ри­тель­ная очист­ка счет­чи­ков}

for i:=1 to DMAX-1 do c[i]:=0;

readln(N);

{ввод дан­ных, под­счет ко­ли­че­ства каж­до­го остат­ка}

for i:=1 to N do begin

readln(D, K);

r := K mod D;

if r>0 then c[r]:=c[r]+1;

end;

{под­счет ко­ли­че­ства раз­ных за­пи­сей}

m:=0;

for i:=1 to DMAX-1 do begin

if c[i]>0 then m:=m+1;

end;

writeln(m);

end.

 

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

 

При­во­дим эф­фек­тив­ное ре­ше­ние Игоря Ку­да­ше­ва на Python 3.

n = int(input())

a = [0] * 100

count = 0

for i in range(n):

    x, y = map(int,input().split())

    a[y % x] += 1

for i in range(1, 100):

    if a[i] != 0: count += 1

print(count)

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

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

1) Вме­сто остат­ка от де­ле­ния K на D вы­чис­ля­ет­ся оста­ток от де­ле­ния D на K.

2) От­сут­ству­ет пред­ва­ри­тель­ная ини­ци­а­ли­за­ция счётчи­ков (для язы­ков, в ко­то­рых нет га­ран­ти­ро­ван­но­го на­чаль­но­го об­ну­ле­ния).

3) Не­вер­но раз­ре­ша­ет­ся кон­фликт ра­вен­ства мак­си­му­мов (вы­би­ра­ет­ся мень­шее зна­че­ние ин­дек­са вме­сто боль­ше­го).

4) Не­вер­но вы­во­дит­ся ответ (или не вы­во­дит­ся ни­ка­ко­го от­ве­та), если все остат­ки ока­за­лись равны нулю.

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

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

ре­ше­ния за­да­чи.

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

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