ЕГЭ. Информатика. Поляков. Решение. C4-30

Особенность задачи — даты(сортировка и вывод).

Условие

На вход программе подаются сведения о ячейках камеры хранения багажа. В первой строке – текущая дата – день (ровно две цифры, от 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;
}
Перейти к верхней панели