На вход программе подаются сведения о пассажирах, забронировавших по Интернету авиабилеты (только тех, у кого время бронирования ещё не истекло). В первой строке задано текущее время: через двоеточие два целых числа, соответствующие часам (от 00 до 23 — ровно 2 символа) и минутам (от 00 до 59 — ровно 2 символа). Во второй строке сообщается число пассажиров N, которое не меньше 3, но не превосходит 1000. Каждая из следующих N строк имеет следующий формат:
<Фамилия> <время окончания брони>,
где <Фамилия> — строка, состоящая не более чем из 20 непробельных символов; <время окончания брони> — через двоеточие два целых числа, соответствующие часам (от 00 до 23 — ровно 2 символа) и минутам (от 00 до 59 — ровно 2 символа). <Фамилия> и <время окончания брони> разделены одним пробелом. Сведения отсортированы в порядке времени, когда производилось бронирование. Все значения времени относятся к текущим суткам.
Требуется написать эффективную программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая в хронологическом порядке (т. е. в порядке возрастания значения времени окончания брони) выведет фамилии пассажиров, у которых в ближайшие 3 часа закончится бронь.
Пример входных данных:
10:00
3
Иванов 13:00
Петров 10:00
Сидоров 13:12
Результат работы программы на этих входных данных:
Петров
Иванов
Программа верно читает входные данные, сразу запоминая только фамилии и значения времени окончания брони в массиве тех, у которых она должна закончиться в ближайшие 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

