banner banner banner
40 задач на Python
40 задач на Python
Оценить:
Рейтинг: 0

Полная версия:

40 задач на Python

скачать книгу бесплатно


Входные данные:

– Первая строка содержит два целых числа: N (2 <= N <= 10^5) – количество комнат, и M (1 <= M <= 2*10^5) – количество проходов между комнатами.

– Следующие M строк содержат описание проходов. Каждая строка содержит три целых числа: a, b и w (1 <= a, b <= N, -10^3 <= w <= 10^3), где a и b – номера комнат, соединенных проходом, а w – стоимость прохождения этого прохода.

Выходные данные:

– Одно целое число – минимальная суммарная стоимость прохождения из комнаты 1 в комнату N. Если путь не существует, вывести -1.

Примеры:

Пример 1:

Входные данные:

5 7

1 2 4

1 3 2

2 3 5

2 4 10

3 4 -3

3 5 3

4 5 4

Выходные данные: 6

Пример 2:

Входные данные:

3 2

1 2 1

2 3 1

Выходные данные: 2

Решение:

Для нахождения минимальной суммарной стоимости прохождения лабиринта из комнаты 1 в комнату N мы можем воспользоваться алгоритмом поиска кратчайшего пути в графе. Мы будем использовать алгоритм Дейкстры для нахождения кратчайшего пути от вершины 1 до вершины N.

Псевдокод:

ввод N, M

инициализация графа G

для каждого i от 1 до M:

ввод a, b, w

добавить ребро (a, b) со стоимостью w в граф G

вызвать алгоритм Дейкстры для поиска кратчайшего пути от вершины 1 до вершины N в графе G

вывод результат

Реализация на Python:

```python

import heapq

def dijkstra(graph, start, end):

pq = [(0, start)]

distances = {v: float('inf') for v in graph}

distances[start] = 0

while pq:

dist, node = heapq.heappop(pq)

if node == end:

return dist

if dist > distances[node]:

continue

for neighbor, weight in graph[node]:

if (new_dist := dist + weight) < distances[neighbor]:

distances[neighbor] = new_dist

heapq.heappush(pq, (new_dist, neighbor))

return -1

# Чтение входных данных

N, M = map(int, input().split())

graph = {i: [] for i in range(1, N + 1)}

for _ in range(M):

a, b, w = map(int, input().split())

graph[a].append((b, w))

graph[b].append((a, w))

# Вызов алгоритма Дейкстры для нахождения кратчайшего пути

min_cost = dijkstra(graph, 1, N)

# Вывод результата

print(min_cost)

```

Эта задача демонстрирует применение алгоритма Дейкстры для нахождения минимального пути в графе. Мы строим граф, где вершинами являются комнаты, а ребрами – проходы между комнатами с их стоимостью прохождения. Затем мы вызываем алгоритм Дейкстры для нахождения кратчайшего пути от комнаты 1 до комнаты N.

Глава 2: Задачи на числа и арифметику

1. Загадка о числовых ребусах

Условие задачи: Для решения числовых ребусов требуется найти, какие буквы представляют собой какие цифры. Каждая буква соответствует уникальной цифре от 0 до 9. Задача состоит в том, чтобы найти такие значения для каждой буквы, чтобы выполнялось правило "одна буква – одна цифра", а также чтобы все равенства в ребусе были верны.

Пример:

Ребус: SEND + MORE = MONEY

Возможное решение: 9567 + 1085 = 10652

Входные данные: Ребус в виде строки, в которой могут быть использованы буквы латинского алфавита в верхнем регистре и знаки арифметических операций (+, -, *, /), а также пробелы.

Выходные данные: Вывести решение ребуса в виде равенства, где буквы заменены на соответствующие им цифры.

Пример:

Входные данные: SEND + MORE = MONEY

Выходные данные: 9567 + 1085 = 10652

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

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

План решения:

1. Идентификация уникальных букв: Необходимо определить все уникальные буквы, которые встречаются в ребусе. Это поможет определить количество букв, для которых нужно найти соответствующие им цифры.

2. Перебор всех возможных комбинаций: Для каждой буквы нужно перебрать все возможные цифры от 0 до 9. Можно использовать рекурсивную функцию для генерации всех возможных комбинаций.

3. Проверка условий ребуса: Для каждой комбинации цифр нужно проверить, удовлетворяют ли они условиям ребуса. Например, сумма двух чисел должна давать третье число.

4. Вывод решения: Если найдены цифры, удовлетворяющие условиям ребуса, необходимо вывести их вместе с соответствующими буквами, образуя равенство.

5. Оптимизация: Можно использовать различные оптимизации, такие как исключение неподходящих комбинаций на ранних этапах, чтобы ускорить поиск решения.

Один из возможных способов решения задачи о числовых ребусах на основе предложенного плана:

```python

# Функция для проверки, что цифры в числе уникальны

def are_digits_unique(num):

return len(set(num)) == len(num)

# Функция для решения числового ребуса

def solve_rebus(rebus):

# Извлекаем уникальные буквы из ребуса

unique_chars = set(char for char in rebus if char.isalpha())

# Генерируем все возможные комбинации цифр для уникальных букв

for digits in itertools.permutations('0123456789', len(unique_chars)):

digits_str = ''.join(digits)

# Проверяем, что ведущие нули отсутствуют и цифры уникальны

if digits_str[0] != '0' and are_digits_unique(digits_str):

# Заменяем буквы на соответствующие цифры в ребусе

rebus_with_digits = rebus.translate(str.maketrans({char: digit for char, digit in zip(unique_chars, digits_str)}))

# Разделяем ребус на левую и правую части