menu
person

Задача №2919

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

Поиск задачи:

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

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 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.

Категория: по информатике | Добавил: Просмотров: 1 | Комментарии: 1 | Теги: Об­ра­бот­ка символьных строк | Рейтинг: 0.0/0
Всего комментариев: 1
avatar
1 konshin_10 • 13:09, 15.05.2018 [Материал]
Решение не верное!!!