Задача 6792. Источник: Поляков. Задание КИМ 26
(ЕГЭ-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