Решение. Программа верно читает входные данные, сразу запоминая только фамилии и значения времени окончания брони в массиве тех, у которых она должна закончиться в ближайшие 3 часа. Время при считывании удобно перевести в минуты и в этом виде хранить и сравнивать. Затем полученный массив значений времени сортируется по неубыванию любым алгоритмом сортировки, параллельно переставляются и элементы массива с фамилиями (возможно использование одного массива записей, состоящих из двух полей). Печатаются элементы массива фамилий в полученном в результате сортировки порядке.
Пример правильной и эффективной программы на языке Паскаль:
type pp=record
name:string[20];
time:integer;
end;
var
p:array[1..1000]of pp;
q:pp;
c,c1:char;
i,j,N,time1:integer;
begin
read(c,c1); {считаны часы текущего времени}
time1:=60*((ord(c)-ord('0'))*10+ ord(c1)-ord('0'));
readln(c,c,c1); {пропущено двоеточие, и считаны минуты}
time1:=time1+(ord(c)-ord('0'))*10+ord(c1)-ord('0');
readln(N);
j:=1;
for i:=1 to N do
begin
p[j].name:='';
repeat
read(c);
p[j].name:=p[j].name+c
until c=' '; {считана фамилия}
read(c,c1); {считаны часы}
p[j].time:=60*((ord(c)-ord('0'))*10+ ord(c1)-ord('0'));
readln(c,c,c1); {пропущено двоеточие, и считаны минуты}
p[j].time:=p[j].time+(ord(c)-ord('0'))*10+ord(c1)-ord('0');
if (p[j].time>=time1)and(p[j].time<=time1+180)then
j:=j+1; {данные занесены в массив}
end;
N:=j-1;
for i:=1 to N-1 do {сортируем данные}
for j:=1 to N-i do
if p[j].time>p[j+1].time then
begin
q:=p[j];
p[j]:=p[j+1];
p[j+1]:=q;
end;
for i:=1 to n do
writeln(p[i].name);
end.
Пример правильной и эффективной программы на языке Бейсик:
DIM t(1000) AS INTEGER
DIM m(1000) AS STRING * 20
DIM s AS STRING
DIM nm AS STRING
LINE INPUT s
time1 = (ASC(MID$(s, 1, 1)) - ASC("0")) * 60 * 10
time1 = time1 + (ASC(MID$(s, 2, 1)) - ASC("0")) * 60
time1 = time1 + (ASC(MID$(s, 4, 1)) - ASC("0")) * 10
time1 = time1 + (ASC(MID$(s, 5, 1)) - ASC("0"))
INPUT N
k = 0
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)
time2 = (ASC(MID$(s, i + 1, 1)) - ASC("0")) * 60 * 10
time2 = time2 + (ASC(MID$(s, i + 2, 1)) - ASC("0")) * 60
time2 = time2 + (ASC(MID$(s, i + 4, 1)) - ASC("0")) * 10
time2 = time2 + (ASC(MID$(s, i + 5, 1)) - ASC("0"))
IF time2 >= time1 AND time2 <= time1 + 180 THEN
k = k + 1
t(k) = time2
m(k) = nm
ENDIF
NEXT j
FOR i = 1 TO k - 1
FOR j = 1 TO k - i
IF t(j) > t(j + 1) THEN
time2 = t(j): nm = m(j)
t(j) = t(j + 1): m(j) = m(j + 1)
t(j + 1) = time2: m(j + 1) = nm
ENDIF
NEXT j
NEXT i
FOR i = 1 TO k
PRINT m(i)
NEXT i
END
Критерии проверки:4 балла ставится за эффективную и правильно работающую программу, которая, возможно, содержит одну синтаксическую ошибку.
3 балла ставится в случае, когда задача фактически решена, но программа содержит до трёх синтаксических ошибок, или если допущена одна содержательная ошибка, или если все входные данные сохраняются в массиве или иной структуре данных (программа неэффективна по памяти, но эффективна по времени работы).
2 балла ставится, если программа неэффективна по времени работы (перебираются все возможные пары элементов), или в программе две содержательные ошибки, либо шесть-семь синтаксических ошибок.
1 балл ставится, если программа написана неверно, но из описания алгоритма и общей структуры программы видно, что экзаменуемый в целом правильно представляет путь решения задачи.
Далее уточняются перечисленные выше критерии.
| Критерии оценивания выполнения задания | Баллы |
|---|
| Программа работает верно и эффективно, т.е. корректно выделяет из входных данных время, запоминает фамилии только тех пассажиров, у которых бронь закончится в ближайшие 3 часа. Фамилии этих пассажиров верно сортируются согласно времени окончания, а затем печатаются. Допускается наличие в тексте программы одной синтаксической ошибки: пропущен или неверно указан знак пунктуации; неверно написано или пропущено зарезервированное слово языка программирования; не описана или неверно описана переменная; применяется операция, не допустимая для соответствующего типа данных. | 4 |
| Программа работает в целом верно, но содержит, по крайней мере, две из следующих нерациональностей: сохраняются фамилии и значения времени для всех пассажиров, сортируются все фамилии, а при печати анализируется, какие из них допустимые. Допускается наличие до трёх синтаксических ошибок, описанных выше. | 3 |
| Программа работает в целом верно, но не всегда верно определяет искомые значения времени или некорректно работает в случае отсутствия искомых времён. Возможно, в реализации алгоритма содержится одна-две ошибки (используется знак «<» вместо «>», «or» вместо «and» и т.п.). Возможно, некорректно организовано считывание входных данных. Допускается наличие до пяти синтаксических ошибок, описанных выше. | 2 |
| Программа неверно работает при некоторых входных данных и, возможно, содержит ошибку в сортировке, или времена сортируются верно, а соответствующие им фамилии нет. Допускается до четырёх различных ошибок в ходе решения задачи, в том числе описанных в критериях присвоения 2 баллов. Допускается наличие до семи синтаксических ошибок, описанных выше. | 1 |
| Не выполнены условия, позволяющие поставить 1, 2, 3 или 4 балла. | 0 |
| Максимальный балл | 4 |