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

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

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

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

  • все 2N чисел, обозначающих время окрашивания и шлифовки для N деталей, упорядочивают по возрастанию;
  • если минимальное число в этом упорядоченном списке – это время шлифовки конкретной детали, то деталь размещают на ленте транспортёра на первое свободное место от её начала;
  • если минимальное число – это время окрашивания, то деталь размещают на первое свободное место от конца ленты транспортёра;
  • если число обозначает время окрашивания или шлифовки уже рассмотренной детали, то его не принимают во внимание.

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

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

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

Пример входного файла:
5
30 50
100 155
150 170
10 160
120 55

При таких исходных данных порядок расположения деталей на ленте транспортёра следующий: 4, 1, 2, 3, 5. Последней займёт своё место на ленте транспортёра деталь 3. При этом до неё будут отшлифованы три детали. Ответ: 3 3.

Решение

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

Python

  1. f = open('26-129.txt')
  2. n = int(f.readline())
  3. a = []
  4. for i in range(1, n + 1):
  5. x, y = map(int, f.readline().split())
  6. a.append([x, i, True])
  7. a.append([y, i, False])
  8. a.sort()
  9. d = [True] * (n + 1)
  10. last = -1
  11. last0 = False
  12. k = 0
  13. for i in a:
  14. if d[i[1]]:
  15. last = i[1]
  16. last0 = i[2]
  17. d[i[1]] = False
  18. if i[2]:
  19. k += 1
  20. if last0:
  21. k -= 1
  22. print(last, k)

PascalABC

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

C++

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

Ответ

895 488

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

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

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

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