На вход программе подаются сведения о ячейках автоматической камеры хранения багажа. В первой строке задана текущая дата: через точку два целых числа, соответствующие дню (от 01 до 31 – ровно 2 символа) и месяцу (от 01 до 12 – ровно 2 символа). Во второй строке сообщается количество занятых ячеек N, которое не меньше 3, но не превосходит 1000. Каждая из следующих N строк имеет следующий формат: <номер ячейки> <дата сдачи багажа>, где <номер ячейки> – четырехзначное число, <дата сдачи багажа> – через точку два целых числа, соответствующие дню (от 01 до 31 – ровно 2 символа) и месяцу (от 01 до 12 – ровно 2 символа). Номер ячейки и дата сдачи багажа разделены одним пробелом.
Время хранения багажа не более трёх суток. Требуется написать эффективную программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая выведет номера ячеек, в которых багаж хранится именно трое суток, т.е. разница между датой сдачи багажа и текущей датой составляет три дня. Номера ячеек следует выводить в порядке возрастания.
Багаж мог сдаваться не ранее чем за три дня до текущей даты. Если дата сдачи багажа больше, чем текущая, то это означает, что багаж был сдан в прошлом году (такая ситуация возможна, только если текущий месяц – январь, а багаж был сдан в декабре). Количество дней в каждом из месяцев года следующее: январь – 31, февраль – 28, март – 31, апрель – 30, май – 31, июнь – 30, июль – 31, август – 31, сентябрь – 30, октябрь – 31, ноябрь – 30, декабрь – 31. Все входные данные корректны.
Пример входных данных:
03.01
3
2000 01.01
1001 31.12
1007 02.01
Результат работы программы для этого примера:
1001
Объяснение
В условии сказано, что багаж мог сдаваться не ранее чем за три дня, значит нам нужно всего лишь узнать день, в который сдали багаж (если сдавали 03.01, то 31, если сдавали 02.03, то 27 и т.д.). Нам остается узнать был ли сдан багаж в прошлом месяце и, если да, то узнать какой это был день, в противном случае просто вычесть 3 из текущей даты, эту дату запишем в отдельную переменную (day_x). Теперь при вводе очередного значения, сравниваем его день с day_x и, если они равны, то записываем номер ячейки в отдельный массив. В конце ввода данных сортируем массив и выводим его в порядке возрастания
Решение на языке Pascal
Показать решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
const k = 3; var days: array [1..12] of byte := (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);//Количество дней в определенном месяце numbers: array of word; //Номера ячеек, которые подошли под условия dat: string; //Дата или строка с датой num: word; //Номер ячейки d, m: byte; //День и месяц day_x: shortint; //День x (дата 3 дней назад) N, l: word; //Количество заданных ячеек и длина масива numbers err: integer; //Вспомогательная переменная procedure sort(var mas: array of word; first, last: integer);//Процедура быстрой сортировки Хоара var l, f, mid, k: integer; begin l := last; f := first; mid := mas[(l + f) div 2]; while f <= l do begin while mas[f] < mid do inc(f); while mas[l] > mid do dec(l); if f <= l then begin k := mas[f]; mas[f] := mas[l]; mas[l] := k; inc(f); dec(l); end; end; if first < l then sort(mas, first, l); if f < last then sort(mas, l + 1, last); end; function perevod(str: string): byte;//функция перевода даты в число var err: integer; c, c1: byte; begin if str[1] = '0' then begin Val(str[2], c, err); perevod := c; end else begin val(str[1], c1, err); val(str[2], c, err); perevod := c1 * 10 + c; end; end; begin l := 0; readln(dat); d := perevod(dat[1:3]); m := perevod(dat[4:6]); day_x := d - k; if day_x <= 0 then if m = 1 then m := 12 else dec(m); day_x := days[m] + day_x; readln(N); for var i := 1 to N do begin readln(dat); d := perevod(dat[6:8]); val(dat[1:5], num, err); if d = day_x then begin inc(l); Setlength(numbers, l); numbers[l - 1] := num; end; end; sort(numbers, 0, l - 1); for var i := 0 to l - 1 do writeln(numbers[i]); end. |
Решения на языке Python
Показать решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import random def QuickSortChoara(A1): QuickSort(A1, 0, len(A1)-1) def QuickSort(A, l, r): if l >= r: return q = A[random.randint(l, r)] i = l j = r while i<=j: while A[i] < q: i += 1 while A[j] > q: j -= 1 if i <= j: A[i], A[j] = A[j], A[i] i += 1 j -= 1 QuickSort(A, l, j) QuickSort(A, j+1, r) k = 3 numbers = [] days = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31} dat = input() d = int(dat[0:2]) m = int(dat[3:]) day_x = d - k if day_x <= 0: if m == 1: m = 12 else: m -= 1 day_x = days[m] + day_x N = int(input()) for i in range(N): num, dat = map(str, input().split()) num = int(num) if int(dat[0:2]) == day_x: numbers.append(num) QuickSortChoara(numbers) for i in range(len(numbers)): print(numbers[i]) |
Похожие задачи: 7448