Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.Python.8-10.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
1.2 Mб
Скачать

Пример программы на языке python:

Path = []

i = n

while i > 0:

    Path.append(i)

    i = Prev[i]

Path.append(0)

Path = Path[::-1]

 

Пример программы на языке pascal:

  i := n;

  j := 1;

  while i > 0 do 

  begin

    Path[j] := i;

    i := Prev[i];

    inc(j);

  end;

  Path[j] := 0;

  for i := j downto 1 do

    write(Path[i], ' '); 

 

 В конце в список Path добавляется начальная вершина номер 0, которая не была обработана в основном цикле, а затем весь список Path разворачивается в обратном порядке (т. к. вершины добавляются в обратном порядке, от конечной к начальной).

Но можно обойтись и без списка Prev. Мы в любой момент можем определить, из какой точки кузнечик пришел в точку i, если сравним C[i-1] и C[i-2]. Поэтому решение о том, к какой вершине переходить при восстановлении ответа можно принимать непосредственно при восстановлении ответа, сравнив C[i-1] и C[i-2]. Путь восстанавливается через ту вершину, для которой значение C будет меньше.

Пример программы на языке python

Path = []

i = n

while i > 0:

    if C[i — 1] < C[i — 2]:

        prev = i — 1

    else:

        prev = i - 2

    Path.append(prev)

    i = prev

Path.append(0)

Path = Path[::-1]

 

Пример программы на языке pascal:

var

  C, Price, Path: array[-1..100] of longint;

  j, i, n, prev: longint;

begin

  readln(n);

  for i := 1 to n do

    read(Price[i]);

  for i := 1 to n do

    C[i] := 0;

  C[-1] := -1;  

  C[0] := 0;

  C[1] := Price[1];

  for i := 2 to n do

    C[i] := min(C[i - 1], C[i - 2]) + Price[i];

  i := n;

  j := 1;

  Path[j] := i;

  while i > 0 do 

  begin

    inc(j);

    if C[i - 1] < C[i - 2] then

      prev := i - 1

    else

      prev := i - 2;

    Path[j] := prev;

    i := prev;

  end;

  Path[j] := 0;

  for i := j downto 1 do

    write(Path[i], ' '); 

end.

Линейные задачи

Многие задачи можно решить за время, линейное относительно размера входных данных (то есть пропорциональное количеству вводимых чисел и т. п.). Некоторые задачи можно решить даже за один проход по массиву (однократный просмотр данных).

Приведем несколько примеров алгоритмов и задач, для которых существуют линейные алгоритмы.

1. Обработка данных за один проход

а. Максимум

б. Второй максимум

в. Пропущено одно из чисел от 1 до N. Какое?

г. Все числа, кроме одного, встречаются по 2 раза.

д*. Больше половины элементов массива - одинаковые

2. Суммы на подотрезках

а. Частичные суммы

б. Сумма каждых K соседних чисел

в. Подотрезок с максимальной суммой

3. Два указателя

а. Подотрезок с заданной суммой, натуральные числа

б. Стильная одежда 

4. Стек и очередь

а. Стек с поддержкой минимума

б. Реализация очереди на двух стеках

в. Очередь с поддержкой минимума

г. Минимум каждых К соседних чисел

5. Скобочные последовательности, баланс

а. Правильная скобочная последовательность из круглых скобок

б. Удалите скобки 

в. Слишком вложенные скобки

г. Правильная скобочная последовательность из трёх видов скобок

6. Одномерная динамика

а. Мячик на лесенке

b. Покупка билетов

7. События: совместная сортировка начал и концов

8. “Рекурсивные” алгоритмы линейной сложности

а. Нахождение медианы

б. Нахождение k-го максимума