Вам даны два массива длины n и m соответственно,...
Tạo vào: 17 tháng 9, 2025
Tạo vào: 17 tháng 9, 2025
Вам даны два массива длины n
и m
соответственно, которые состоят из 0
и 1
.
Нужно заменить каждый 0
на чётное положительное число и каждую 1
на нечётное положительное число. После замен оба массива должны возрастать, и каждое положительное число должно быть использовано не более одного раза (все использованные числа должны быть различны).
Казалось бы, легкая задача. А попробуйте минимизировать максимальное используемое число!
Вот как решается задача оптимально.
Пусть в сумме по обоим массивам:
Очевидные нижние границы на максимальное использованное число :
Но ещё есть «локальные» ограничения из-за чередований внутри каждого массива. Для одного массива минимальный возможный максимум равен значению, получающемуся при жадной “прокатке”:
textcur = 0 for bit in a: # bit=0 требует чётное, bit=1 — нечётное if bit == 0: # следующий чётный > cur cur += 1 if cur % 2 == 1 else 2 else: # следующий нечётный > cur cur += 1 if cur % 2 == 0 else 2 # по завершении cur = F(a)
Интуиция: на каждом шаге берём «ближайшее» число нужной чётности, строго большее текущего.
Например:
[0,0,0] → 2,4,6 ⇒ F=6
,[1,1,1] → 1,3,5 ⇒ F=5
,[0,1] → 2,3 ⇒ F=3
,[1,0,1] → 1,2,3 ⇒ F=3
.Минимально возможный максимальный номер
Этого достаточно и это необходимо.
curA
и каждый раз брать минимальное число нужной чётности curA
из своего пула (и удалять его);Если хочешь, накину короткую реализацию (Python/C++) или проверю конкретные входные массивы и выведу сами присвоения.