Особенность задачи — даты(сортировка и вывод).
Условие
На вход программе подаются сведения о ячейках камеры хранения багажа. В первой строке – текущая дата – день (ровно две цифры, от 01 до 31), затем через точку – месяц (ровно две цифры, от 01 до 12). Во второй строке сообщается количество занятых ячеек N (не меньше 3, но не больше 1000). Каждая из следующих строк имеет формат:
<номер ячейки> <дата сдачи багажа>
Номер ячейки – это целое число, дата – 5 символов: день (ровно две цифры, от 01 до 31), затем через точку – месяц (ровно две цифры, от 01 до 12). Сведения отсортированы по номерам ячеек. Все даты относятся к одному календарному году. Считать, что в феврале 28 дней.
Нужно вывести номера тех ячеек, в которых багаж хранится более 3 дней в хронологическом порядке сдачи багажа. Например, если исходные данные были такие:
04.06
3
1000 01.06
1001 31.05
2007 21.05
то результат должен быть следующий:
2007
1001
Решение
#include <stdio.h> #include <iostream> #include <string.h> struct info { int cell, day, month; }; // возвращает количество дней месяца int get_day(int month) { int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; return months[month-1]; } int main() { int curr_day, curr_month; scanf("%d.%d", &curr_day, &curr_month); int N; scanf("%d", &N); info arr[1000]; memset(arr, 0, 1000 * sizeof(info)); // обнуляем массив // ввод значений for (int i = 0; i < N; i++) { scanf("%d %d.%d", &arr[i].cell, &arr[i].day, &arr[i].month); } // сортируем массив в порядке убывания, месяц в приоритете for (int i = 0; i < N; i++) { for (int j = 0; j < N-1; j++) { if (arr[j].month > arr[j+1].month || (arr[j].month == arr[j+1].month && arr[j].day > arr[j+1].day)) { std::swap(arr[j], arr[j+1]); } } } for (int i = 0; i < N; i++) { if ( (curr_month - arr[i].month == 1 && get_day(arr[i].month) - arr[i].day + curr_day > 3) || (curr_month - arr[i].month > 1) || (curr_month == arr[i].month && curr_day - arr[i].day > 3)) { printf("%d\n", arr[i].cell); } } return 0; }