Тип Д19 C4 № 4603 
Обработка символьных строк. Буквенно-числовые строки
i
На вход программе подаются сведения о пассажирах, желающих сдать свой багаж в камеру хранения на заранее известное время до полуночи. В первой строке сообщается число пассажиров N, которое не меньше 3, но не превосходит 1000; во второй строке – количество ячеек в камере хранения М, которое не меньше 10, но не превосходит 1000. Каждая из следующих N строк имеет следующий формат:
<Фамилия> <время сдачи багажа> <время освобождения ячейки>, где <Фамилия> – строка, состоящая не более чем из 20 непробельных символов; <время сдачи багажа> – через двоеточие два целых числа, соответствующие часам (от 00 до 23 – ровно 2 символа) и минутам (от 00 до 59 – ровно 2 символа); <время освобождения ячейки> имеет тот же формат.
<Фамилия> и <время сдачи багажа>, а также <время сдачи багажа> и <время освобождения ячейки> разделены одним пробелом. Время освобождения больше времени сдачи.
Сведения отсортированы в порядке времени сдачи багажа. Каждому из пассажиров в камере хранения выделяется свободная ячейка с минимальным номером. Если в момент сдачи багажа свободных ячеек нет, то пассажир уходит, не дожидаясь освобождения одной из них. Требуется написать программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая будет выводить на экран для каждого пассажира номер ему предоставленной ячейки (можно сразу после ввода данных очередного пассажира). Если ячейка пассажиру не предоставлена, то его фамилия не печатается.
Пример входных данных:
3
10
Иванов 09:45 12:00
Петров 10:00 11:00
Сидоров 12:00 13:12
Результат работы программы на этих входных данных:
Иванов 1
Петров 2
Сидоров 1
Решение. Программа верно читает входные данные, сразу запоминая только время окончания хранения багажа в массиве, соответствующем ячейкам камеры хранения. Подходящая ячейка определяется путём последовательного просмотра элементов этого массива до первого свободного или такого, в котором записано время окончания хранения, не превосходящее текущего времени сдачи очередного багажа. В случае удачного выбора ячейки фамилия и номер ячейки распечатываются. Баллы начисляются только за программу, которая решает задачу хотя бы для частного случая. Время можно как переводить в минуты, так и хранить в виде строки, сравнивая затем строки непосредственно. В последнем случае упрощается ввод данных.
Пример правильной программы на языке Паскаль:
var p:array[1..1000] of integer;
c,c1:char;
i,j,N,K:integer;
name:string;
time1,time2:integer;
begin
readln(N,K);
for i:=1 to K do
p[i]:=0;
for i:=1 to N do
begin
name:='';
repeat
read(c);
name:=name+c
until c=' '; {считана фамилия}
read(c,c1); {считаны часы первого времени}
time1:=60*((ord(c)-ord('0'))*10+ ord(c1)-ord('0'));
read(c,c,c1); {пропущено двоеточие, и считаны минуты}
time1:=time1+(ord(c)-ord('0'))*10+ord(c1)-ord('0');
read(с,c,c1); {считаны часы второго времени}
time2:=60*((ord(c)-ord('0'))*10+ ord(c1)-ord('0'));
readln(c,c,c1); {пропущено двоеточие, и считаны минуты}
time2:=time2+(ord(c)-ord('0'))*10+ord(c1)-ord('0');
for j:=1 to K do
if p[j]<=time1 then
begin
p[j]:=time2;
writeln(name,' ',j);
break;
end;
end;
end.
Пример правильной программы на языке Бейсик:
DIM p(1000) AS INTEGER
DIM s AS STRING
DIM nm AS STRING
INPUT n
INPUT k
FOR i = 1 TO k
p(i) = 0
NEXT i
FOR j = 1 TO n
LINE INPUT s
c$ = MID$(s, 1, 1)
i = 1
WHILE NOT (c$ = " ")
i = i + 1
c$ = MID$(s, i, 1)
WEND
nm = MID$(s, 1, i)
time1 = (ASC(MID$(s, i + 1, 1)) - ASC("0")) * 60 * 10
time1 = time1 + (ASC(MID$(s, i + 2, 1)) - ASC("0")) * 60
time1 = time1 + (ASC(MID$(s, i + 4, 1)) - ASC("0")) * 10
time1 = time1 + (ASC(MID$(s, i + 5, 1)) - ASC("0"))
time2 = (ASC(MID$(s, i + 7, 1)) - ASC("0")) * 60 * 10
time2 = time2 + (ASC(MID$(s, i + 8, 1)) - ASC("0")) * 60
time2 = time2 + (ASC(MID$(s, i + 10, 1)) - ASC("0")) * 10
time2 = time2 + (ASC(MID$(s, i + 11, 1)) - ASC("0"))
FOR i = 1 TO k
IF time1 >= p(i) THEN
p(i) = time2
PRINT nm, i
GOTO 10
ENDIF
NEXT i
10 NEXT j
END
Критерии проверки:| Критерии оценивания выполнения задания | Баллы |
|---|
| Программа работает верно, т.е. корректно выделяет из входных данных время, ищет первую свободную ячейку и распечатывает в случае успеха результат. Фамилии пассажиров и время сдачи багажа при этом не запоминаются. Допускается наличие в тексте программы одной синтаксической ошибки: пропущен или неверно указан знак пунктуации; неверно написано или пропущено зарезервированное слово языка программирования; не описана или неверно описана переменная; применяется операция, не допустимая для соответствующего типа данных. Допускается наличие одной из нерациональностей: сохраняются фамилии пассажиров; сохраняется как время сдачи багажа, так и время освобождения ячейки; до 4 анализа данных очередного пассажира анализируется массив, соответствующий ячейкам камеры хранения на предмет освобождения ячеек к данному времени | 4 |
| Программа работает в целом верно, но содержит, по крайней мере, две из указанных выше нерациональностей; допускается наличие до трёх синтаксических ошибок, описанных выше | 3 |
| Программа работает в целом верно, но не всегда определяет для хранения допустимую ячейку с минимальным номером или некорректно работает в случае отсутствия свободных ячеек. Возможно, в реализации алгоритма содержится одна-две ошибки (используется знак «<» вместо «>», «or» вместо «and» и т.п.). Возможно, некорректно организовано считывание входных данных. Допускается до трёх ошибок в ходе решения задачи. Допускается наличие до пяти синтаксических ошибок, описанных выше | 2 |
| Программа неверно работает при некоторых входных данных и, возможно, содержит ошибку в определении свободной ячейки. Допускается до четырёх различных ошибок в ходе решения задачи, в том числе описанных в критериях. Допускается наличие до семи синтаксических ошибок, описанных выше | 1 |
| Задание выполнено неверно | 0 |
| Максимальный балл | 4 |