Форум » Обработка числовых последовательностей » Не могу найти ошибку » Ответить

Не могу найти ошибку

Danko: Решал С4 из вот этого варианта:Соревнования по игре «Тетрис-онлайн» проводятся по следующим правилам: 1. Каждый участник регистрируется на сайте игры под определённым игровым именем. Имена участников не повторяются. 2. Чемпионат проводится в течение определённого времени. В любой момент этого времени любой зарегистрированный участник может зайти на сайт чемпионата и начать зачётную игру. По окончании игры её результат (количество набранных очков) фиксируется и заносится в протокол. 3. Участники имеют право играть несколько раз. Количество попыток одного участника не ограничивается. 4. Окончательный результат участника определяется по одной, лучшей для данного участника игре. 5. Более высокое место в соревнованиях занимает участник, показавший лучший результат. 6. При равенстве результатов более высокое место занимает участник, раньше показавший лучший результат. В ходе соревнований заполняется протокол, каждая строка которого описывает одну игру и содержит результат участника и его игровое имя. Протокол формируется в реальном времени по ходу проведения чемпионата, поэтому строки в нём расположены в порядке проведения игр: чем раньше встречается строка в протоколе, тем раньше закончилась соответствующая этой строке игра. Спонсор чемпионата предоставил призы различной ценности для награждения K лучших игроков (K≤20). Если участников окажется меньше K, призами награждаются все. Вам необходимо написать эффективную, в том числе по памяти, программу, которая по данным протокола определяет K лучших игроков и занятые ими места. Перед текстом программы кратко опишите алгоритм решения задачи и укажите используемый язык программирования и его версию. Описание входных данных Первая строка содержит числа K – количество имеющихся призов и N – общее количество строк протокола. Каждая из следующих N строк содержит записанные через пробел результат участника (целое положительное число, не превышающее 100 миллионов) и игровое имя (имя не может содержать пробелов). Строки исходных данных соответствуют строкам протокола и расположены в том же порядке, что и в протоколе. Описание выходных данных Программа должна вывести имена и результаты K лучших игроков в порядке занятых мест по форме, приведённой ниже в примере. Если игроков окажется меньше K, нужно вывести данные обо всех игроках. Пример входных данных: 6 15 69485 Jack 95715 qwerty 95715 Alex 83647 M 197128 qwerty 95715 Jack 93289 Alex 95715 Alex 95715 M 32768 BilboBaggins 99824 TetrisMaster 45482 BilboBaggins 62123 BilboBaggins 77623 M 56791 Champion Пример выходных данных для приведённого выше примера входных данных: 1. qwerty (197128) 2. TetrisMaster (99824) 3. Alex (95715) 4. Jack (95715) 5. M (95715) 6. BilboBaggins (62123) . Программа работает, но неверно выводит некоторых участников, ошибку найти не могу. Моё решение: program  tetris; program  tetris; var rez: array[1..20] of record score: longint; name: string; end; name0: string; score0, i, N: longint; K, m: byte; a, b: integer; begin    Readln(K, N);   for i := 1 to N do begin     readln(score0, name0);     if i = 1 then begin     rez.name := name0;     rez.score := score0; end else begin     for m := K downto 1 do begin     if score0 > rez[m].score then     a := m;     if name0 = rez[m].name then     b := m; end; if b = 0 then begin for m := K downto a + 1 do begin rez[m].name := rez[m - 1].name; rez[m].score := rez[m - 1].score; if m = a + 1 then begin rez[a].name := name0; rez[a].score := score0; end; end; end;     if (a = b) and (a <> 0) then begin     rez[a].score := score0;     rez[a].name:=name0; end else     for m := b downto a + 1 do begin      rez[m].name := rez[m - 1].name;      rez[m].score := rez[m - 1].score;     if m = a + 1 then begin     rez[a].score := score0;     rez[a].name := name0; end; end; end; end;     for i := 1 to K do begin     writeln(i, '.', rez.name, '(', rez.score, ')');     end; end.

Ответов - 1

Danko: Помогите,пожалуйста!



полная версия страницы