ЕГЭ. Информатика. Поляков. Решение. 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;
}