Задача 6316. Источник: Поляков. Задание КИМ 26
(Досрочный ЕГЭ-2023) Входной файл содержит заявки пассажиров, желающих сдать свой багаж в камеру хранения. В заявке указаны время сдачи багажа и время освобождения ячейки (в минутах от начала суток). Багаж одного пассажира размещается в одной свободной ячейке с минимальным номером. Ячейки пронумерованы начиная с единицы. Размещение багажа в ячейке или её освобождение происходит в течение 1 мин. Багаж можно поместить в только что освобождённую ячейку начиная со следующей минуты. Если в момент сдачи багажа свободных ячеек нет, то пассажир уходит. Определите, сколько пассажиров сможет сдать свой багаж в течение 24 часов и какой номер будет иметь ячейка, которую займут последней. Если таких ячеек несколько, укажите минимальный номер ячейки.
Входные данные представлены в файле 26-111.txt следующим образом. В первой строке входного файла находится натуральное число K, не превышающее 1000, – количество ячеек в камере хранения. Во второй строке – натуральное число N (N ≤ 1000), обозначающее количество пассажиров. Каждая из следующих N строк содержит два натуральных числа, каждое из которых не превышает 1440: указанное в заявке время размещения багажа в ячейке и время освобождения ячейки (в минутах от начала суток).
Запишите в ответе два числа: количество пассажиров, которые смогут воспользоваться камерой хранения, и номер последней занятой ячейки.
Пример входного файла:
2
5
30 60
40 1000
59 60
61 1000
1010 1440
При таких исходных данных положить вещи в камеру хранения смогут первый, второй, четвёртый и пятый пассажиры. Последний пассажир положит вещи в ячейку 1, так как ячейки 1 и 2 будут свободны. Ответ: 4 1.
Решение
Условие задачи не совсем полное. Поскольку в файле есть пассажиры с одинаковым временем сдачи багажа, результат будет зависеть от сортировки. Ответу соответствует сортировка в порядке возрастания по обоим полям.
Считываем данные в массив/список и сортируем их по обоим полям. Создадим массив/список lockers, где будем хранить время освобождения каждой ячейки. Для каждого пассажира ищем свободную ячейку с минимальным номером. Если такая ячейка нашлась, увеличиваем счетчик count и меняем время освобождения ячейки. Значение последней ячейки last меняется только в том случае, если время сдачи багажа больше, чем у предыдущего пассажира. Таким образом, если последними будет несколько пассажиров с одинаковым временем сдачи багажа, в last будет минимальная ячейка.
Python
f = open('26-111.txt')
k = int(f.readline())
n = int(f.readline())
a = [[int(y) for y in x.split()] for x in f]
a.sort()
lockers = [0] * k
count = 0
last = 0
lasttime = 0
for i in a:
locker = -1
for j in range(0, k):
if lockers[j] < i[0]:
locker = j
break
if locker != -1:
if i[0] > lasttime:
last = locker + 1
lasttime = i[0]
count += 1
lockers[locker] = i[1]
print(count, last)
PascalABC
var
n, k, count, last, lasttime, locker, min, i, j, t: Integer;
a: array [1..987, 1..2] of Integer;
lockers: array [1..210] of Integer;
f: TEXT;
begin
Assign(f, '26-111.txt');
Reset(f);
Readln(f, k, 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;
for i := 1 to k do
lockers[i] := 0;
count := 0;
last := 0;
lasttime := 0;
for i := 1 to n do
begin
locker := 0;
for j := 1 to k do
if lockers[j] < a[i, 1] then
begin
locker := j;
break;
end;
if locker <> 0 then
begin
if a[i, 1] > lasttime then
begin
last := locker;
lasttime := a[i, 1];
end;
count := count + 1;
lockers[locker] := a[i][2]
end;
end;
Writeln(count, ' ', last);
end.
C++
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream f;
f.open("26-111.txt");
int k, n;
f >> k >> 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;
}
}
int lockers[210];
for (int i = 0; i < k; i++)
lockers[i] = 0;
int count = 0, last = 0, lasttime = 0;
for (int i = 0; i < n; i++)
{
int locker = -1;
for (int j = 0; j < k; j++)
if (lockers[j] < a[i][0])
{
locker = j;
break;
}
if (locker != -1)
{
if (a[i][0] > lasttime)
{
last = locker + 1;
lasttime = a[i][0];
}
count++;
lockers[locker] = a[i][1];
}
}
cout << count << " " << last << endl;
}
Ответ
344 53