Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
19.05.2015
Размер:
719.36 Кб
Скачать

Var Info: array[1..1000] of tInfo;

M, N, i, j, ball, mesto: integer;

c: char;

temp: TInfo;

begin

readln(N); { число спортсменов }

readln(M); { число видов многоборья }

for i:=1 to N do begin

Info[i].name := '';

for j:=1 to 2 do { читаем два блока: фамилию и имя }

repeat

read(c);

Info[i].name := Info[i].name + c;

until c = ' ';

{ читаем баллы и суммируем их }

Info[i].sum := 0;

for j:=1 to M do begin

read(ball);

Info[i].sum := Info[i].sum + ball;

end;

end;

{ сортировка массива }

for i:=1 to N-1 do

for j:=N-1 downto i do

if Info[j].sum < Info[j+1].sum then begin

temp := Info[j];

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

Info[j+1] := temp;

end;

{ вывод таблицы результатов }

mesto := 1;

for i:=1 to N do begin

if (i > 1) and (Info[i].sum < Info[i-1].sum) then

mesto := mesto + 1;

writeln(Info[i].name, ' ', Info[i].sum, ' ', mesto);

end;

end.

  1. В этой задаче используются данные типа «время», которые вводятся в символьном виде. Работать с ними в таком формате (например, сравнивать) неудобно, потому нужно переводить время в числовую форму, например, в число минут от 00:00. Так время 09:45 преобразуется в число 60*9+45=585.

Поскольку эта операция выполняется неоднократно в разных местах программы (сначала ввод текущего времени в первой строке, а потом – ввод времени освобождения ячейки для каждого пассажира), удобно написать функцию, которая преобразует символьную строку в формате hh:mm (hh обозначает часы, а mm – минуты) в целое число так, как рассказано выше. Вот пример такой функции:

function Time2Int(sTime: string): integer;

Var h, m, code0: integer;

begin

code0 := Ord('0');

h := 10*(Ord(sTime[1])-code0) + (Ord(sTime[2])-code0);

m := 10*(Ord(sTime[4])-code0) + (Ord(sTime[5])-code0);

Time2Int := 60*h + m;

end;

Здесь в переменную code0 мы записываем код символа '0', чтобы не вычислять его повторно.

В условии сказано, что число пассажиров в списке не превышает 1000, это явное указание на то, что нужно прочитать данные в массив записей примерно такой структуры:

type TInfo = record

name: string[20]; { фамилия }

time: integer; { время освобождения ячейки }

end;

Сам массив мы объявим так:

Var Info: array[1..1000] of tInfo;

Сложность заключается в том, что нам нужно записывать в массив информацию только о тех пассажирах, для которых время освобождения ячейки не больше, чем curTime+120, где curTime – текущее время. Все остальные строки нужно игнорировать. Это значит, что требуется ввести счетчик count (целую переменную) , в которой мы будем хранить количество «хороших» пассажиров, которые освободят свои ячейки не более, чем через 2 часа (120 минут). Получается такой цикл ввода:

count := 0;

for i:=1 to N do begin

... { здесь ввести данные в Info[count+1] }

if Info[count+1].time <= curTime+120 then

count := count + 1;

end;

Иначе говоря, мы вводим данные в первый неиспользованный элемент массива Info, а к следующему переходим только тогда, когда очередной пассажир «хороший» и его данные нужно сохранить.

Как вводить данные? Хотя все официальные рекомендации по решению задачи С4 основаны на посимвольном вводе данных, многие профессионалы предпочитают сначала прочитать всю очередную строку в символьную переменную s, а потом «разбирать» ее в памяти. В данном случае такой подход позволяет значительно упростить программу, и мы его применим (для разнообразия).

Будем вводить строку s целиком, искать пробел и делить ее на две части (слева от пробела – фамилия, справа – время). Затем время преобразуем в целое число с помощью уже написанной функции Time2Int:

for i:=1 to N do begin

readln(s);

p := Pos(' ', s);

Info[count+1].name := Copy(s,1,p-1);

Info[count+1].time := Time2Int(Copy(s,p+1,Length(s)-p));

if Info[count+1].time <= curTime+120 then

count := count + 1;

end;

Теперь остается только отсортировать массив и вывести список фамилий в нужном порядке. Важно не забыть, что нужно сортировать не N элементов, а count (именно столько мы нашли «хороших» пассажиров):

for i:=1 to count do

for j:=count-1 downto i do

if Info[j].time > Info[j+1].time then begin

temp := Info[j];

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

Info[j+1] := temp;

end;

Вот полная программа:

type TInfo = record

name: string[20];

time: integer;

end;

Соседние файлы в папке ЕГЗ_2012_Поляков_май