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

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

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

(А. Рогов) В отделении банка используется система распознавания лиц, с помощью которой фиксируется время, когда посетитель пришел в отделение и время, когда он вышел. Для удобства время хранится как целое число, показывающее, сколько секунд прошло от начала суток до события. Посетителей банка обслуживают операторы, которые пронумерованы, начиная с 1. Посетитель обслуживается свободным оператором с минимальным номером. Оператор может принять следующего посетителя в ту же секунду, как обслуживаемый им посетитель покидает здание. На обслуживание требуется, как минимум, одна секунда. Если свободных операторов нет, посетитель становится в очередь. Посетитель может не дождаться своей очереди и уйти.

Определите, сколько посетителей было обслужено операторами и номер оператора, обслужившего последнего посетителя.

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

Запишите в ответе два числа: количество посетителей, обслуженных операторами, и номер оператора, обслужившего последнего посетителя.

Пример входного файла:
6 2
1 50
2 40
5 100
50 86000
60 70
70 100

При таких исходных данных были успешно обслужены 4 посетителя, пятый и шестой ушли раньше, чем подошла их очередь. Последнего посетителя обслуживал оператор 1. Ответ: 4 1.

Решение

Сортируем исходные данные в массиве a по времени прибытия посетителей и последовательно обрабатываем список. В массиве m будем хранить время, когда освобождаются операторы. Обрабатывая каждого посетителя, ищем оператора с минимальным номером, который освободился до прибытия посетителя. Если такового не нашлось, ищем оператора с минимальным номером и временем освобождения, которое меньше времени ухода посетителя. Если свободный оператор нашелся, увеличиваем счетчик обслуженных посетителей, фиксируем номер оператора в переменной last и обновляем время освобождения данного оператора.

Python

  1. f = open('26-132.txt')
  2. n, k = map(int, f.readline().split())
  3. m = [0] * (k + 1)
  4. a = [[int(y) for y in x.split()] for x in f]
  5. a.sort(key = lambda x:x[0])
  6. count = 0
  7. last = 0
  8. for i in a:
  9. z = -1
  10. for j in range(1, k + 1):
  11. if m[j] <= i[0]:
  12. z = j
  13. break
  14. if z == -1:
  15. for j in range(1, k + 1):
  16. if m[j] < i[1] and (z == -1 or m[j] < m[z]):
  17. z = j
  18. if z != -1:
  19. count += 1
  20. last = z
  21. m[z] = i[1]
  22. print(count, last)

PascalABC

  1. var
  2. n, k, i, j, t, z, min, count, last: Integer;
  3. a: array [1..3200, 1..2] of Integer;
  4. m: array [1..500] of Integer;
  5. f: TEXT;
  6. begin
  7. Assign(f, '26-132.txt');
  8. Reset(f);
  9. Readln(f, n, k);
  10. for i := 1 to n do
  11. Readln(f, a[i, 1], a[i, 2]);
  12. for i := 1 to k do
  13. m[i] := 0;
  14. for i := 1 to n - 1 do
  15. begin
  16. min := i;
  17. for j := i + 1 to n do
  18. if a[j, 1] < a[min, 1] then
  19. min := j;
  20. if min <> i then
  21. begin
  22. t := a[i, 1];
  23. a[i, 1] := a[min, 1];
  24. a[min, 1] := t;
  25. t := a[i, 2];
  26. a[i, 2] := a[min, 2];
  27. a[min, 2] := t;
  28. end;
  29. end;
  30. count := 0;
  31. last := 0;
  32. for i := 1 to n do
  33. begin
  34. z := 0;
  35. for j := 1 to k do
  36. if m[j] < a[i][1] then
  37. begin
  38. z := j;
  39. break;
  40. end;
  41. if z = 0 then
  42. for j := 1 to k do
  43. if (m[j] < a[i][2]) and ((z = 0) or (m[j] < m[z])) then
  44. z := j;
  45. if z <> 0 then
  46. begin
  47. count := count + 1;
  48. last := z;
  49. m[z] := a[i][2]
  50. end;
  51. end;
  52. Writeln(count, ' ', last);
  53. end.

C++

  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. int main()
  5. {
  6. ifstream f;
  7. f.open("26-132.txt");
  8. int n, k;
  9. f >> n >> k;
  10. int a[3200][2], m[501];
  11. for (int i = 0; i < n; i++)
  12. f >> a[i][0] >> a[i][1];
  13. for (int i = 0; i < k; i++)
  14. m[i] = 0;
  15. for (int i = 0; i < n - 1; i++)
  16. {
  17. int min = i;
  18. for (int j = i + 1; j < n; j++)
  19. if (a[j][0] < a[min][0])
  20. min = j;
  21. if (min != i)
  22. {
  23. int t = a[i][0];
  24. a[i][0] = a[min][0];
  25. a[min][0] = t;
  26. t = a[i][1];
  27. a[i][1] = a[min][1];
  28. a[min][1] = t;
  29. }
  30. }
  31. int count = 0, last = 0;
  32. for (int i = 0; i < n; i++)
  33. {
  34. int z = -1;
  35. for (int j = 1; j <= k; j++)
  36. if (m[j] < a[i][0])
  37. {
  38. z = j;
  39. break;
  40. }
  41. if (z == -1)
  42. for (int j = 1; j <= k; j++)
  43. if (m[j] < a[i][1] && (z == -1 || m[j] < m[z]))
  44. z = j;
  45. if (z != -1)
  46. {
  47. count++;
  48. last = z;
  49. m[z] = a[i][1];
  50. }
  51. }
  52. cout << count << " " << last << endl;
  53. }

Ответ

2108 9

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

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

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

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