Присоединиться

11 класс·высокий уровень

В первой строке задано текущее время: через двоеточие два целых числа

Условие

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

Далее уточняются перечисленные выше критерии.

Формат задания

Развёрнутый ответ: короткого ответа здесь нет — оценивается само рассуждение. Разбор откроется после входа.

Решение по шагам

  1. Как рассуждать

    Решение. Программа верно читает входные данные, сразу запоминая только фамилии и значения времени окончания брони в массиве тех, у которых она должна закончиться в ближайшие 3 часа. Время при считывании удобно перевести в минуты и в этом виде хранить и сравнивать. Затем полученный массив значений времени сортируется по неубыванию любым алгоритмом сортировки, параллельно переставляются и элементы массива с фамилиями (возможно использование одного массива записей, состоящих из двух полей). Печатаются элементы массива фамилий в полученном в результате сортировки порядке. Пример правильной и эффективной программы на языке Паскаль: type pp=recordname:string[20];time:integer;end;varp:array[1..1000]of pp;q:pp;c,c1:char;i,j,N,time1:integer;beginread(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 dobeginp[j].name:='';repeatread(c);p[j].name:=p[j].name+cuntil 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)thenj:=j+1; {данные занесены в массив}end;N:=j-1;for i:=1 to N-1 do {сортируем данные}for j:=1 to N-i doif p[j].time>p[j+1].time thenbeginq:=p[j];p[j]:=p[j+1];p[j+1]:=q;end;for i:=1 to n dowriteln(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∗10time1=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"))∗10time1=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 = MID(s, 1,

Осталось ещё 4 шага

  1. i = 1 WHILE NOT (c = " ") i = i + 1 c =…

  2. WEND nm = MID(s, 1, i) time2 = (ASC(MID(s, i…

  3. THEN time2 = t(j): nm = m(j) t(j) = t(j + 1)…

  4. = nm ENDIF NEXT j NEXT i FOR i = 1 TO k PRINT…

Получить полное решение

Бесплатно · займёт минуту

Другие задачи по теме «Обработка символьных строк»