Я давно столкнулся с такой задачей, но на днях вспомнил о ней=) Требуется написать программу, которая уравнивает два числа a и b. Нужно использовать две операции +1 и *2 на двух числах. К примеру, числа 7, 13 ===> 14,14 (7*2,13+1) Все перепробовал... Может существует какой-то алгоритм? Я думаю что эта задача из раздела ДП. Проверочный тест — 14 62
Пусть
a
меньше заb
, тогда ка
будем добавлять 1 пока все его биты не совпадут с первыми битами числаb
, после этого множим числоа
на 2 пока числа не уравняются и по ходу умножения добавляем 1 еслиlen(a)+i
(len(a)
— длинна в битах числаа
) бит числаb
будет 1 или не добавляем ничего.О(min(a,b)+log(max(a,b)))
UPD: только сейчас заметил, что количество действий не будет минимальным :( так как не изменятся числоb
ans[i] = min(ans[i + 1], ans[2 * i]) + 1, где i >= a — число, из которого надо получить число b, i + 1 и 2 * i <= b, ans[b] = 0
Либо же жадное решение — если b можно разделить на 2 и b / 2 >= a, то делим, иначе отнимаем b -= 1, т.е. обратный путь из b в a, не знаю, работает или нет
Пусть числа a и b.
Предположим, не нарушая общности, что a < b.
Тогда b - a раз сделаем следующее:
К a прибавим 1.
После этого числа станут равными.
Доказательство:
Пусть к числу a прибавили b - a раз по единице. Значит новое первое число будет равно:
a + (b - a)·1 = a + b - a = b.
Второе число равно b.
Доказано.
Код:
Также можно решать эту задачу с помошью динамического программирования. Приведу сразу код:
Надеюсь, что мой комментарий помог вам понять решение задачи.
за один ход можно применять операции +1, *2 только один раз, операции с двумя числами
То есть за один ход обязательно применение по одной операции к обоим числам? (Авторы комментариев выше решали другую задачу, я спрашиваю только чтоб внести ясность). И было бы неплохо узнать ограничения.
ДА, по одной. Либо a+1 и b*2, либо a*2 и b+1