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

В те­ле­ви­зи­он­ном тан­це­валь­ном ма­ра­фо­не с опре­де­ле­ни­ем по­бе­ди­те­ля с по­мо­щью те­ле­зри­те­лей после каж­до­го тура объ­яв­ля­ет­ся sms-го­ло­со­ва­ние, в ко­то­ром зри­те­ли ука­зы­ва­ют наи­бо­лее по­нра­вив­шу­ю­ся им пару из мак­си­мум 16 пар, ко­то­рые участ­ву­ют в про­ек­те. Вам пред­ла­га­ет­ся на­пи­сать про­грам­му, ко­то­рая будет об­ра­ба­ты­вать ре­зуль­та­ты sms-го­ло­со­ва­ния по дан­но­му во­про­су. Ре­зуль­та­ты го­ло­со­ва­ния по­лу­че­ны в виде но­ме­ров пар (каж­дый эле­мент спис­ка со­от­вет­ству­ет од­но­му sms-со­об­ще­нию).

 

Вам пред­ла­га­ет­ся два за­да­ния с по­хо­жи­ми усло­ви­я­ми: за­да­ние А и за­да­ние Б. Вы мо­же­те ре­шать оба за­да­ния или одно из них по сво­е­му вы­бо­ру. За­да­ние Б более слож­ное, его ре­ше­ние оце­ни­ва­ет­ся выше. Ито­го­вая оцен­ка вы­став­ля­ет­ся как мак­си­маль­ная из оце­нок за за­да­ния А и Б.

 

За­да­ние А. Име­ет­ся набор дан­ных, со­сто­я­щий из 15 чисел.

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

Мак­си­маль­ная оцен­ка за пра­виль­ную про­грам­му – 2 балла.

 

За­да­ние Б. Име­ет­ся набор дан­ных, со­сто­я­щий из целых чисел. Набор может быть очень боль­шим.

На­пи­ши­те про­грам­му для ре­ше­ния этой за­да­чи.

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

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

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

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

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

 

Сле­ду­ет учи­ты­вать, что ко­ли­че­ство го­ло­сов в спис­ке может быть очень ве­ли­ко. Перед тек­стом про­грам­мы крат­ко опи­ши­те ис­поль­зу­е­мый Вами ал­го­ритм ре­ше­ния за­да­чи. На вход про­грам­ме в пер­вой стро­ке подаётся ко­ли­че­ство при­шед­ших sms-со­об­ще­ний N. В каж­дой из по­сле­ду­ю­щих N строк за­пи­сан номер пары от 1 до 16.При­мер вход­ных дан­ных:

 

4

2

16

3

2

 

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

 

2 2

3 1

16 1

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

Ре­ше­ние.

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

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

Var n, i, j, t: integer;

Count, Names: array[1..16] of integer;

Begin

For i := 1 to 16 do

begin

Count[i] := 0;

Names[i] := i;

end;

ReadLn(N); {Счи­ты­ва­ем ко­ли­че­ство го­ло­сов}

for i:=1 to N do

begin

ReadLn(t); {счи­та­ли оче­ред­ную пару}

Count[t] := Count[t] + 1;{под­счи­ты­ва­ем её}

end;

{Сор­ти­ру­ем мас­си­вы Names и Count в по­ряд­ке убы­ва­ния зна­че­ний мас­си­ва Count}

for i:=16 downto 2 do

for j:=2 to i do if Count[j-1] < Count[j] then

begin

t:=Count[j]; Count[j]:=Count[j-1]; Count[j-1]:=t;

t:=Names[j]; Names[j]:=Names[j-1]; Names[j-1]:=t;

end;

for i:=1 to 16 do

if Count[i] > 0 then

writeLn(Names[i], ' ', Count[i]);

end.

DIM N, i, j, t AS INTEGER

DIM Count(16) AS INTEGER

DIM Names(16) AS INTEGER

FOR i = 1 TO 16

Count(i) = 0

Names(i) = i

NEXT i

INPUT N ' Счи­ты­ва­ем ко­ли­че­ство го­ло­сов

FOR i = 1 TO N

INPUT t 'счи­та­ли пару

'Под­счи­ты­ва­ем её

Count(t) = Count(t) + 1

NEXT i

'Сор­ти­ру­ем мас­си­вы Names и Count в по­ряд­ке убы­ва­ния

'зна­че­ний мас­си­ва Count

FOR i = 16 TO 2 STEP -1

FOR j = 2 TO i

IF Count(j - 1) < Count(j) THEN

t = Count(j): Count(j) = Count(j - 1): Count(j - 1) = t

t = Names(j): Names(j) = Names(j - 1): Names(j - 1) = t

END IF

NEXT j

NEXT i

FOR i = 1 TO 16

IF Count(i) > 0 THEN PRINT Names(i), Count(i)

NEXT i

END

 

При­ведём ре­ше­ние Да­ни­и­ла До­цен­ко, Pascal ABC.

 

var a:array [1..16] of integer;

k,i,n,j:integer;

begin

  readln(n);

  for i:=1 to n do begin

    readln(k);

    a[k]:=a[k]+1;

  end;

  k:=0;

  for i:=1 to 16 do

    if a[i]>k then k:=a[i];

    for j:=k downto 1 do

      for i:=1 to 16 do

        if j=a[i] then writeln(i,' ',a[i]);

end.

 

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

var

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

val: integer; {пара}

lenght: integer; {ко­ли­че­ство го­ло­сов за пару}

i, j, k: integer;

begin

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

for i:=1 to 15-1 do

for j:=1 to 15-i do

if a[j] < a[j+1] then begin

k := a[j];

a[j] := a[j+1];

a[j+1] := k;

end;

lenght := 1;

for i := 1 to 15 do

if a[i]=a[i+1] then

lenght := lenght + 1

else begin

writeln(a[i], ' ', lenght);

lenght := 1;

end;

end.

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

Кри­те­рии оце­ни­ва­ния вы­пол­не­ния за­да­нияБаллы
Про­грам­ма ра­бо­та­ет для любых вход­ных дан­ных про­из­воль­но­го раз­ме­ра и на­хо­дит ответ, не со­хра­няя вход­ные дан­ные в мас­си­ве, раз­мер ко­то­ро­го со­от­вет­ству­ет числу N (ко­ли­че­ству за­про­сов), а под­счи­ты­вая в мас­си­ве раз­ме­ром 12, сколь­ко раз встре­ти­лась та или иная за­да­ча. До­пус­ка­ет­ся на­ли­чие в тек­сте про­грам­мы трёх син­так­си­че­ских оши­бок: про­пу­щен или не­вер­но ука­зан знак пунк­ту­а­ции; не­вер­но на­пи­са­но или про­пу­ще­но за­ре­зер­ви­ро­ван­ное слово языка про­грам­ми­ро­ва­ния; не опи­са­на или не­вер­но опи­са­на пе­ре­мен­ная; при­ме­ня­ет­ся опе­ра­ция, не­до­пу­сти­мая для со­от­вет­ству­ю­ще­го типа дан­ных (если одна и та же ошиб­ка встре­ча­ет­ся не­сколь­ко раз, то это счи­та­ет­ся за одну ошиб­ку) 4
Про­грам­ма ра­бо­та­ет верно, но вход­ные дан­ные со­хра­ня­ют­ся в мас­си­ве, раз­мер ко­то­ро­го со­от­вет­ству­ет числу N. Этот мас­сив, воз­мож­но, потом сор­ти­ру­ет­ся. Или для уве­ли­че­ния числа встре­ча­е­мо­сти оче­ред­ной пары ис­поль­зу­ет­ся цикл от 1 до 16, или опе­ра­тор case, или 16 опе­ра­то­ров if. До­пус­ка­ет­ся на­ли­чие до пяти син­так­си­че­ских оши­бок, опи­сан­ных выше. Воз­мож­но, в прин­ци­пи­аль­но верно ор­га­ни­зо­ван­ном вводе дан­ных есть одна ошиб­ка. 3 балла также вы­став­ля­ет­ся, если в эф­фек­тив­ной про­грам­ме, удо­вле­тво­ря­ю­щей кри­те­ри­ям вы­став­ле­ния 4 бал­лов, есть одна ошиб­ка, в ре­зуль­та­те ко­то­рой про­грам­ма ра­бо­та­ет не­вер­но на не­ко­то­рых на­бо­рах не­ти­пич­ных вход­ных дан­ных (на­при­мер, все по­да­ли го­ло­са за одну и ту же пару). Также 3 балла вы­став­ля­ет­ся, если про­грам­ма вы­во­дит на экран все пары с вер­ным ко­ли­че­ством по­дан­ных за них го­ло­сов, но среди них есть и те, за кого не было по­да­но ни од­но­го го­ло­са 3
Про­грам­ма ра­бо­та­ет в целом верно, эф­фек­тив­но или нет, но в ре­а­ли­за­ции ал­го­рит­ма со­дер­жит­ся до двух оши­бок (не­вер­ная ини­ци­а­ли­за­ция счётчи­ков, хотя в пред­ло­жен­ных выше ре­ше­ни­ях об­ну­лять их не тре­бу­ет­ся; воз­мож­но, про­грам­ма ра­бо­та­ет не­вер­но, если в спис­ке упо­мя­ну­то мень­ше 16 пар, выход за гра­ни­цу мас­си­ва, до­пу­ще­на ошиб­ка в прин­ци­пи­аль­но верно ор­га­ни­зо­ван­ной сор­ти­ров­ке, ис­поль­зу­ет­ся знак “<” вме­сто “<=”, “or” вме­сто “and” и т.п.). Воз­мож­но, не­кор­рект­но ор­га­ни­зо­ва­но счи­ты­ва­ние вход­ных дан­ных. До­пус­ка­ет­ся на­ли­чие до семи син­так­си­че­ских оши­бок, опи­сан­ных выше2
Про­грам­ма, воз­мож­но, ра­бо­та­ет не­вер­но при не­ко­то­рых вход­ных дан­ных, но по при­ведённому тек­сту ре­ше­ния ясно, что эк­за­ме­ну­е­мый по­ни­ма­ет, из каких эта­пов долж­но со­сто­ять ре­ше­ние за­да­чи. При ис­поль­зо­ва­нии сор­ти­ров­ки она может быть ре­а­ли­зо­ва­на прин­ци­пи­аль­но не­вер­но (на­при­мер, вме­сто двух цик­лов ис­поль­зу­ет­ся один). Всего до­пус­ка­ет­ся до четырёх раз­лич­ных оши­бок в ре­а­ли­за­ции ал­го­рит­ма, в том числе опи­сан­ных в кри­те­ри­ях при­сво­е­ния 2 бал­лов. До­пус­ка­ет­ся на­ли­чие лю­бо­го ко­ли­че­ства син­так­си­че­ских оши­бок, опи­сан­ных выше1
За­да­ние не вы­пол­не­но или вы­пол­не­но не­вер­но0
Мак­си­маль­ный балл4

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

Источник: ЕГЭ по ин­фор­ма­ти­ке 08.07.2013. Вто­рая волна. Ва­ри­ант 602
Денис Шегай 12.02.2019 23:24

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

 

var

a, b: array [1..16] of integer;

x, n, i, max, max2: integer;

 

begin

read(n);

for i := 1 to n do

begin

read(x);

a[x] += 1;

if a[x] > max then

max := a[x];

end;

while max > 0 do

begin

for i := 1 to 16 do

begin

if a[i] = max then

writeln(i, ' ', a[i]);

if (a[i] > max2) and (a[i] < max) then

max2 := a[i];

end;

max := max2;

max2 := 0;

end;

end.