Для решения данной задачи необходимо найти пары кусков досок, которые в сумме дают одинаковую длину. Вот шаги, чтобы понять и реализовать решение:
Чтение входных данных: Сначала считываем количество исходных досок
nи затем длины кусковdиз входных данных.Обработка кусков: Так как у нас есть
2 * nкусков, необходимо создать структуру, которая позволит отслеживать длину каждой части и её индекс. Для этого удобен словарь (или просто массив), где ключом будет сумма, а значением — список индексов кусков, дающих эту сумму.Сумма двух кусков: Для каждого куска
d[i], мы генерируем свою пару, проверяя, которая часть вместе с ней может образовать пару с одинаковой длиной. Мы используем словарь, чтобы хранить суммируемые пары.Формирование результата: Когда мы найдём все пары кусков, мы можем вычислить длину исходных досок, которая равна удвоенной сумме каждого уникального значения из кусков.
Вывод результата: В конце выводим найденную сумму (длину) и сами пары кусков.
Вот пример кода для реализации решения:
def find_pairs(n, lengths):
from collections import defaultdict
pairs = []
sum_dict = defaultdict(list)
# Find the sum and indices
for index in range(2 * n):
for j in range(index + 1, 2 * n):
current_sum = lengths[index] + lengths[j]
sum_dict[current_sum].append((index + 1, j + 1)) # Store indices with 1-based indexing
# We know that all sums should yield valid pairs, we'll take the first n pairs that we encounter
used_indices = set()
original_length = -1 # to be calculated
for key, indices in sum_dict.items():
if len(indices) >= 1:
for pair in indices:
a, b = pair
if a not in used_indices and b not in used_indices:
pairs.append((a, b))
used_indices.add(a)
used_indices.add(b)
if len(pairs) == n: # Found n pairs
original_length = key
break
if original_length != -1:
break
# Output the result
print(original_length)
for a, b in sorted(pairs):
print(a, b)
# Чтение входных данных
n = int(input())
lengths = list(map(int, input().split()))
# Вызов функции для поиска пар
find_pairs(n, lengths)
Пояснение к коду:
- Мы используем
defaultdict, который позволяет автоматически создавать список, если он еще не был задан. - Вложенный цикл ищет все пары, но количество операций растет квадратично, что в пределах ограничений задачи может быть приемлемо.
- Проверяем и собираем только уникальные индексы.
- На выходе мы предоставляем длину исходных досок и пары в соответствии с требуемым форматом.
Попробуйте реализовать данный код и протестировать его с примерами, чтобы увидеть, как он работает!
