Программное решение задач ЕГЭ по информатике

Задача 6792. Источник: Поляков. Задание КИМ 26

Страница задачи 6792

(ЕГЭ-2023) Система наблюдения ежеминутно фиксирует вход и выход посетителей магазина (в минутах, прошедших от начала суток). Считается, что в моменты фиксации входа и выхода посетитель находится в магазине. Нулевая минута соответствует моменту открытия магазина, который работает 24 ч в сутки без перерыва. Менеджер магазина анализирует данные системы наблюдения за прошедшие сутки, и выявляет отрезки времени наибольшей длины, в течение которых число посетителей, находящихся в магазине, не изменялось. Далее менеджер выбирает пики посещаемости – промежутки времени, когда количество посетителей в магазине было наибольшим. Пиков посещаемости в течение суток может быть несколько.

Входной файл содержит время входа и выхода каждого посетителя магазина. Определите, сколько пиков посещаемости было в течение суток, и укажите число посетителей в момент пика посещаемости.

Входные данные представлены в файле 26-130.txt следующим образом. Первая строка входного файла содержит натуральное число N (1 ≤ N ≤ 10000) – количество посетителей магазина. Следующие N строк содержат пары чисел, обозначающих соответственно время входа и время выхода посетителя (все числа натуральные, не превышающие 1440).

Запишите в ответе два натуральных числа: сначала найденное количество пиков посещаемости, а затем число посетителей в момент пика посещаемости.

Пример входного файла:
6
10 50
100 150
110 155
120 160
130 170
152 170

При таких исходных данных будет два пика посещаемости: с 130 по 150 минуту и с 152 по 155 минуту. Число посетителей в момент этих пиков равно 4. Ответ: 2 4.

Решение

Считаем данные в двухмерный массив/список и отсортируем по времени входа в магазин, а при равенстве времени входа, по времени выхода. В переменной shop будем сохранять время выхода посетителей, находящихся в магазине. Размер данного списка/массива/вектора и является количеством людей, находящихся в магазине одновременно. Последовательно обрабатываем отсортированный список данных. Удаляем из shop всех покупателей, которые покинули магазин до визита обрабатываемого посетителя, добавляем информацию о новом посетителе и анализируем список на максимальный размер. Чтобы обнаружить другой пик с максимальным количеством покупателей, в переменной last будем сохранять последний размер shop. Новый пик засчитывается, если в last значение меньше максимального.

Python

f = open('26-130.txt')
n = int(f.readline())
a = [[int(y) for y in x.split()] for x in f]
a.sort()
kmx = 0
mx = 0
last = 0
shop = []
for i in a:
    j = 0;
    while j < len(shop):
        if shop[j] < i[0]:
            del shop[j]
        else:
            j += 1
    shop.append(i[1])
    if len(shop) > mx:
        mx = len(shop)
        kmx = 1
    elif len(shop) == mx and last != mx:
        kmx += 1
    last = len(shop)
print(kmx, mx)

PascalABC

var
    n, max, min, kmax, last, i, j, t: Integer;
    a: array [1..987, 1..2] of Integer;
    shop: array of Integer = new Integer[0];
    f: TEXT;
begin
    Assign(f, '26-130.txt');
    Reset(f);
    Readln(f, n);
    for i := 1 to n do
        Readln(f, a[i, 1], a[i, 2]);
    for i := 1 to n - 1 do
    begin
        min := i;
        for j := i + 1 to n do
            if (a[j, 1] < a[min, 1]) or (a[j, 1] = a[min, 1]) and (a[j, 2] < a[min, 2]) then
                min := j;
        if min <> i then
        begin
            t := a[i, 1];
            a[i, 1] := a[min, 1];
            a[min, 1] := t;
            t := a[i, 2];
            a[i, 2] := a[min, 2];
            a[min, 2] := t;
        end;
    end;
    max := 0;
    kmax := 0;
    last := 0;
    for i := 1 to n do
    begin
        j := 0;
        while j < shop.Length do
            if shop[j] < a[i, 1] then
                shop := shop[:j] + shop[j + 1:]
            else
                j := j + 1;
        shop := shop + Arr(a[i, 2]);
        if shop.Length > max then
        begin
            max := shop.Length;
            kmax := 1;
        end
        else if (shop.Length = max) and (last <> max) then
            kmax := kmax + 1;
        last := shop.Length;
    end;
    Writeln(kmax, ' ', max);
end.

C++

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int main()
{
    ifstream f;
    f.open("26-130.txt");
    int n;
    f >> n;
    int a[987][2];
    for (int i = 0; i < n; i++)
        f >> a[i][0] >> a[i][1];
    for (int i = 0; i < n - 1; i++)
    {
        int min = i;
        for (int j = i + 1; j < n; j++)
            if (a[j][0] < a[min][0] || a[j][0] == a[min][0] && a[j][1] < a[min][1])
                min = j;
        if (min != i)
        {
            int t = a[i][0];
            a[i][0] = a[min][0];
            a[min][0] = t;
            t = a[i][1];
            a[i][1] = a[min][1];
            a[min][1] = t;
        }
    }
    vector<int> shop;
    int max = 0, kmax = 0, last = 0;
    for (int i = 0; i < n; i++)
    {
        int j = 0;
        while (j < shop.size())
            if (shop[j] < a[i][0])
                shop.erase(shop.begin() + j);
            else
                j++;
        shop.push_back(a[i][1]);
        if (shop.size() > max)
        {
            max = shop.size();
            kmax = 1;
        }
        else if (shop.size() == max && last != max)
            kmax++;
        last = shop.size();
    }
    cout << kmax << " " << max << endl;
}

Ответ

1 644

Отправить замечание по решению

Код по которому имеется замечание:

Ваш вариант кода:

Комментарий: