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

Со­рев­но­ва­ния по игре «Тет­рис-он­лайн» про­во­дят­ся по сле­ду­ю­щим пра­ви­лам.

1.  Каж­дый участ­ник ре­ги­стри­ру­ет­ся на сайте игры под опре­делённым иг­ро­вым име­нем. Имена участ­ни­ков не по­вто­ря­ют­ся.

2.  Чем­пи­о­нат про­во­дит­ся в те­че­ние опре­делённого вре­ме­ни. В любой мо­мент этого вре­ме­ни любой за­ре­ги­стри­ро­ван­ный участ­ник может зайти на сайт чем­пи­о­на­та и на­чать зачётную игру. По окон­ча­нии игры её ре­зуль­тат

(ко­ли­че­ство на­бран­ных очков) фик­си­ру­ет­ся и за­но­сит­ся в про­то­кол.

3.  Участ­ни­ки имеют право иг­рать не­сколь­ко раз. Ко­ли­че­ство по­пы­ток од­но­го участ­ни­ка не огра­ни­чи­ва­ет­ся.

4.  Окон­ча­тель­ный ре­зуль­тат участ­ни­ка опре­де­ля­ет­ся по одной игре, луч­шей для дан­но­го участ­ни­ка.

5.  Более вы­со­кое место в со­рев­но­ва­ни­ях за­ни­ма­ет участ­ник, по­ка­зав­ший луч­ший ре­зуль­тат.

6.  При ра­вен­стве ре­зуль­та­тов более вы­со­кое место за­ни­ма­ет участ­ник, рань­ше по­ка­зав­ший луч­ший ре­зуль­тат.

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

 

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

 

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

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

 

Га­ран­ти­ру­ет­ся, что ко­ли­че­ство участ­ни­ков со­рев­но­ва­ний не мень­ше 3.

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

Про­грам­ма долж­на вы­ве­сти имена и ре­зуль­та­ты трёх луч­ших иг­ро­ков по форме,

при­ведённой ниже в при­ме­ре.

 

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

9

69485 Jack

95715 qwerty

95715 Alex

83647 M

197128 qwerty

95715 Jack

93289 Alex

95715 Alex

95715 M

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

дан­ных:

1 место. qwerty (197128)

2 место. Alex (95715)

3 место. Jack (95715)

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

Ре­ше­ние.

Для каж­до­го иг­ро­ка нам не­об­хо­ди­мо знать толь­ко мак­си­маль­ное ко­ли­че­ство очков, ко­то­рое тот смог на­брать, и мо­мент вре­ме­ни, в ко­то­рый это ко­ли­че­ство было на­бра­но. Будем хра­нить для каж­до­го иг­ро­ка имя, мак­си­маль­ное ко­ли­че­ство очков, ко­то­рое он на­брал на дан­ный мо­мент, и время, в ко­то­рое было на­бра­но это ко­ли­че­ство. При до­бав­ле­нии новой за­пи­си будем про­бе­гать по спис­ку и ис­кать иг­ро­ка с дан­ным име­нем. Если та­ко­го иг­ро­ка нет, до­ба­вим его. Если есть, то срав­ним его преды­ду­щий ре­зуль­тат с новым и, если нужно, об­но­вим. После того, как счи­та­ны все дан­ные, три раза по­вто­рим про­це­ду­ру: найдём иг­ро­ка с мак­си­маль­ным ко­ли­че­ством очков. Если таких не­сколь­ко, вы­бе­рем из них иг­ро­ка и ми­ни­маль­ным вре­ме­нем. Вы­пи­шем его ре­зуль­тат. Те­перь в его очки за­пи­шем -1, чтобы в сле­ду­ю­щий раз он никак не мог быть луч­шим.

 

Ниже при­ведён код ре­ше­ния на языке Pascal вер­сии 2.6.2. Эф­фек­тив­ный по па­мя­ти и вре­ме­ни.

 

var a,a1,a2,a3,i,n:longint;

s,s1,s2,s3:string;

Begin

readln(n);

a1:=0;

a2:=0;

a2:=0;

s1:='';

s2:='';

s3:='';

for i:=1 to n do begin

read(a,s);

if a>a1 then begin

if s=s1 then begin a1:=a; s1:=s; end

else if s=s2 then begin a2:=a1; s2:=s1; a1:=a; s1:=s end

else begin

a3:=a2;

a2:=a1;

s3:=s2;

s2:=s1;

a1:=a;

s1:=s;

end;

end else if a>a2 then begin

if s=s2 then begin s2:=s; a2:=a; end

else if (s<>s1) then begin

a3:=a2;

s3:=s2;

a2:=a;

s2:=s;

end;

end else if a>a3 then begin

if (s<>s1) and (s<>s2) then begin

a3:=a;

s3:=s;

end;

end;

end;

writeln('1 место.',s1,' (',a1,')');

writeln('2 место.',s2,' (',a2,')');

writeln('3 место.',s3,' (',a3,')');

end.

 

 

Ниже при­ведён код ре­ше­ния на языке Pascal вер­сии 2.6.2. Не яв­ля­ю­ще­го­ся эф­фек­тив­ным по па­мя­ти.

 

var n, i, j, cnt, p, found, best, first, ind : longint;

s : string;

name : array [1..100000] of string;

points, num : array [1..100000] of longint;

begin

readln(n);

for i := 1 to n do

begin

read(p);

readln(s);

found := 0;

for j := 1 to cnt do

if s = name[j] then

found := j;

if found = 0 then

begin

inc(cnt);

name[cnt] := s;

points[cnt] := -1;

found := cnt;

end;

if p > points[found] then

begin

points[found] := p;

num[found] := i;

end;

end;

for i := 1 to 3 do

begin

best := -1;

for j := 1 to cnt do

if (points[j] > best) or (points[j] = best) and (num[j] < first) then

begin

best := points[j];

first := num[j];

ind := j;

end;

writeln(i, ' место.', name[ind], ' (', points[ind], ')');

points[ind] := -1;

end;

end.

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

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

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

1. Не­вер­ный ввод ис­ход­ных дан­ных

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

3. Не­вер­но опре­де­ля­ет­ся по­ря­док мест при рав­ных ре­зуль­та­тах.

4. При вы­во­де не учи­ты­ва­ет­ся, что ко­ли­че­ство участ­ни­ков может быть мень­ше К.

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

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

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

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

2
Про­грам­ма ра­бо­та­ет в от­дель­ных част­ных слу­ча­ях.

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

1
Не вы­пол­не­но ни одно из усло­вий, поз­во­ля­ю­щих по­ста­вить 3, 2 или 1 балл0
Мак­си­маль­ный балл4
Гость 10.02.2016 22:23

Ре­ше­ние не ра­ци­о­наль­но по па­мя­ти, т.к. со­дер­жит два огром­ных мас­си­ва дан­ных. На много ра­ци­о­наль­нее хра­нить толь­ко дан­ные для 3 при­зо­вых мест. На­при­мер:

var a,a1,a2,a3,i,n:longint;

s,s1,s2,s3:string;

Begin

readln(n);

a1:=0;

a2:=0;

a2:=0;

s1:='';

s2:='';

s3:='';

for i:=1 to n do begin

read(a,s);

if a>a1 then begin

if s=s1 then begin a1:=a; s1:=s; end

else if s=s2 then begin a2:=a1; s2:=s1; a1:=a; s1:=s end

else begin

a3:=a2;

a2:=a1;

s3:=s2;

s2:=s1;

a1:=a;

s1:=s;

end;

end else if a>a2 then begin

if s=s2 then begin s2:=s; a2:=a; end

else if (s<>s1) then begin

a3:=a2;

s3:=s2;

a2:=a;

s2:=s;

end;

end else if a>a3 then begin

    if (s<>s1) and (s<>s2) then begin

    a3:=a;

    s3:=s;

    end;

    end;

end;

writeln('1 место.',s1,' (',a1,')');

writeln('2 место.',s2,' (',a2,')');

writeln('3 место.',s3,' (',a3,')');

end.