Для решения задачи, которую поставил Тимофей, необходимо учесть, как распиливаются палочки в зависимости от их длины — чётные делятся пополам, а нечётные распиливаются на две части, максимально близкие по длине. После распиловки нужно подсчитать количество получившихся палочек каждого размера и выбрать размер с наибольшим количеством. Если таких размеров несколько, выбираем наименьший.
Давайте рассмотрим алгоритм:
Инициализация данных:
- Создать массив для хранения количества палочек каждого размера, где индекс будет представлять размер палочки.
Обработка входных данных:
- Прочитать длины палочек и их количества из входных данных.
- Сохранить данные в структуре, например, в массиве.
Распиловка палочек:
- Перебрать каждую доступную длину палочек и для каждой длины проверить, чётная она или нечётная.
- Если палочка чётная: увеличить количество палочек длиной
d/2на 2. - Если палочка нечётная: увеличить количество палочек длиной
⌊d/2⌋и⌈d/2⌉на 1.
Подсчёт максимальных палочек одного размера:
- Перебрать массив с количеством палочек и определить максимальное значение.
- Запомнить размер, соответствующий максимальному количеству.
Вывод результата:
- Вывести максимальное количество палочек одного размера и сам размер.
Пример реализации данного алгоритма на Python:
n = int(input())
count = [0] * (n + 1)
for i in range(1, n + 1):
di = int(input())
count[i] += di
# Создаем словарь для хранения палочек
sticks = {}
for length in range(1, n + 1):
if count[length] > 0: # Если есть палочки этой длины
if length % 2 == 0: # Чётная длина
length_half = length // 2
if length_half in sticks:
sticks[length_half] += count[length] * 2
else:
sticks[length_half] = count[length] * 2
else: # Нечётная длина
floor_half = length // 2
ceil_half = (length // 2) + 1
if floor_half in sticks:
sticks[floor_half] += count[length]
else:
sticks[floor_half] = count[length]
if ceil_half in sticks:
sticks[ceil_half] += count[length]
else:
sticks[ceil_half] = count[length]
# Поиск максимального количества и размера
max_count = 0
best_length = float('inf')
for length, cnt in sticks.items():
if cnt > max_count or (cnt == max_count and length < best_length):
max_count = cnt
best_length = length
print(max_count)
print(best_length)
Объяснение кода:
- Мы начинаем с чтения количества палочек и заполняем массив с количеством палочек каждого размера.
- Затем распиливаем палочки и обновляем их количество в словаре
sticks. - В конце, анализируем словарь, чтобы найти максимальное количество палочек и запоминаем их размер.
Таким образом, Тимофей сможет получить максимальное количество бит одного размера для организации соревнований.
