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

1 минут

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

Условие🔗︎

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

Решение на C++🔗︎

#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;
}

Решение на Rust🔗︎

use std::{cmp::Ordering, io};

struct Info {
    cell: u32,
    day: u32,
    month: u32,
}

fn main() {
    let date_input: Vec<u32> = read_input_value()
        .split('.')
        .map(|str| str.parse().expect("Ошибка ввода"))
        .collect();

    if date_input.len() != 2 {
        panic!("Ошибка ввода");
    }

    let (current_day, current_month) = (date_input[0], date_input[1]);

    let amount: usize = read_input_value().parse().expect("Ошибка ввода");

    let mut array: Vec<Info> = Vec::new();

    for _i in 0..amount {
        let item: Vec<u32> = read_input_value()
            .split([' ', '.'])
            .map(|str| str.parse().expect("Ошибка ввода"))
            .collect();

        if item.len() != 3 {
            panic!("Ошибка ввода");
        }

        array.push(Info {
            cell: item[0],
            day: item[1],
            month: item[2],
        });
    }

    array.sort_by(|a, b| {
        if a.month > b.month || a.month == b.month && a.day > b.day {
            return Ordering::Greater;
        }

        if a.month == b.month && a.day == b.day {
            return Ordering::Equal;
        }

        Ordering::Less
    });

    for item in array {
        if current_month - item.month == 1
            && get_days_in_month(item.month) - item.day + current_day > 3
            || current_month - item.month > 1
            || current_month == item.month && current_day - item.day > 3
        {
            println!("{}", item.cell);
        }
    }
}

fn read_input_value() -> String {
    let mut input = String::new();

    io::stdin().read_line(&mut input).expect("Ошибка ввода");

    input.trim().to_string()
}

fn get_days_in_month(month: u32) -> u32 {
    let months: [u32; _] = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    months[month as usize + 1]
}